<p>Given a string&nbsp;<code>s</code><var>,</var>&nbsp;return <em>the maximum&nbsp;number of unique substrings that the given string can be split into</em>.</p>

<p>You can split string&nbsp;<code>s</code> into any list of&nbsp;<strong>non-empty substrings</strong>, where the concatenation of the substrings forms the original string.&nbsp;However, you must split the substrings such that all of them are <strong>unique</strong>.</p>

<p>A <strong>substring</strong> is a contiguous sequence of characters within a string.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;ababccc&quot;
<strong>Output:</strong> 5
<strong>Explanation</strong>: One way to split maximally is [&#39;a&#39;, &#39;b&#39;, &#39;ab&#39;, &#39;c&#39;, &#39;cc&#39;]. Splitting like [&#39;a&#39;, &#39;b&#39;, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;cc&#39;] is not valid as you have &#39;a&#39; and &#39;b&#39; multiple times.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;aba&quot;
<strong>Output:</strong> 2
<strong>Explanation</strong>: One way to split maximally is [&#39;a&#39;, &#39;ba&#39;].
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;aa&quot;
<strong>Output:</strong> 1
<strong>Explanation</strong>: It is impossible to split the string any further.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li>
	<p><code>1 &lt;= s.length&nbsp;&lt;= 16</code></p>
	</li>
	<li>
	<p><code>s</code> contains&nbsp;only lower case English letters.</p>
	</li>
</ul>

#include<math.h> 
#include<vector>  
#include<set> 
 
class Solution {
public:  
    void traverse(int index,const std::string& source
    ,std::set<std::string>& values,std::vector<std::vector<std::string>>& stores){
        if(index>=source.length()){
            std::vector<std::string> vected(values.begin(),values.end()) ;  
            stores.insert(stores.end(),vected) ;  
            return ;  }  
        std::string phase = "" ; 
        for( int dx=index;dx<source.length();dx++){
            char check = source[dx] ; 
            phase.append(1,check) ; 
            if(values.find(phase)==values.end( )){
                values.insert(phase) ; 
                traverse(dx+1,source,values,stores) ; 
                values.erase(phase) ; 
            }
        }
    }  
    int maxUniqueSplit(string sample) {
        std::set<std::string>  values ; 
        std::vector<std::vector<std::string>> nested ;  
        traverse(0,sample,values,nested) ; 
        int highest = 0 ;  
        for(int ce=0;ce<nested.size( );ce++){
           const std::vector<std::string>& phase =  nested[ce] ; 
            highest = fmax(highest,phase.size()) ;  
        }  
        return highest ;  
    }
};
166619