#include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
int max(int a,int b)
{
return a>b?a:b;
}
int max(int a,int b,int c)
{
return max(max(a,b),c);
}
int search(vector<char> v,char c)
{
vector<char>::iterator it;
for(it=v.begin();it<v.end();it++)
{
if(c==(*it))
return 1;
}
return 0;
}
int crossing_mid(char str[],int low,int mid,int high)
{
vector<char> v;
v.push_back(str[mid]);
int i=mid-1;int j=mid+1;
while(str[i]!=str[j])
{
int k=search(v,str[i]);
int l=search(v,str[j]);
if((!k)&&(!l))
{
v.push_back(str[i]);
v.push_back(str[j]);
i--;j++;
}
if(k)
{
while((j<=high)&&(!search(v,str[j])))
{
v.push_back(str[j]);
j++;
}
return v.size();
}
if(l)
{
while((i>=low)&&(!search(v,str[i])))
{
v.push_back(str[i]);
i--;
}
return v.size();
}
}
int s=v.size();
while((j<=high)&&(!search(v,str[j])))
{
v.push_back(str[j]);
j++;
}
int p=v.size();
v.resize(s);
while((i>=low)&&(!search(v,str[i])))
{
v.push_back(str[i]);
i--;
}
int q=v.size();
return max(p,q);
}
int fun(char str[],int low,int high)
{
if(low==high)
return 1;
if(high-low==1)
return str[low]==str[high]?1:2;
int mid=(low+high)/2;
return max(fun(str,low,mid-1),
fun(str,mid+1,high),
crossing_mid(str,low,mid,high));
}
int main()
{
char str[]="geeksforgeeks";
cout<<fun(str,0,strlen(str)-1)<<" is the max non repeatong substring.\n";
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxzdHJpbmcuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IG1heChpbnQgYSxpbnQgYikKewoJcmV0dXJuIGE+Yj9hOmI7Cn0KaW50IG1heChpbnQgYSxpbnQgYixpbnQgYykKewoJcmV0dXJuIG1heChtYXgoYSxiKSxjKTsKfQppbnQgc2VhcmNoKHZlY3RvcjxjaGFyPiB2LGNoYXIgYykKewoJdmVjdG9yPGNoYXI+OjppdGVyYXRvciBpdDsKCWZvcihpdD12LmJlZ2luKCk7aXQ8di5lbmQoKTtpdCsrKQoJewoJCWlmKGM9PSgqaXQpKQoJCSAgIHJldHVybiAxOwoJfQoJcmV0dXJuIDA7Cn0KaW50IGNyb3NzaW5nX21pZChjaGFyIHN0cltdLGludCBsb3csaW50IG1pZCxpbnQgaGlnaCkKewoJdmVjdG9yPGNoYXI+IHY7Cgl2LnB1c2hfYmFjayhzdHJbbWlkXSk7CglpbnQgaT1taWQtMTtpbnQgaj1taWQrMTsKCXdoaWxlKHN0cltpXSE9c3RyW2pdKQoJewoJCWludCBrPXNlYXJjaCh2LHN0cltpXSk7CgkJaW50IGw9c2VhcmNoKHYsc3RyW2pdKTsKCQlpZigoIWspJiYoIWwpKQoJCXsKCQkJdi5wdXNoX2JhY2soc3RyW2ldKTsKCQkJdi5wdXNoX2JhY2soc3RyW2pdKTsKCQkJaS0tO2orKzsKCQl9CgkJaWYoaykKCQl7CgkJCXdoaWxlKChqPD1oaWdoKSYmKCFzZWFyY2godixzdHJbal0pKSkKCQkJewoJCQkJdi5wdXNoX2JhY2soc3RyW2pdKTsKCQkJCWorKzsKCQkJfQoJCQlyZXR1cm4gdi5zaXplKCk7CgkJfQoJCWlmKGwpCgkJewoJCQl3aGlsZSgoaT49bG93KSYmKCFzZWFyY2godixzdHJbaV0pKSkKCQkJewoJCQkJdi5wdXNoX2JhY2soc3RyW2ldKTsKCQkJCWktLTsKCQkJfQoJCQlyZXR1cm4gdi5zaXplKCk7CgkJfQoJfQoJaW50IHM9di5zaXplKCk7Cgl3aGlsZSgoajw9aGlnaCkmJighc2VhcmNoKHYsc3RyW2pdKSkpCgl7CgkJdi5wdXNoX2JhY2soc3RyW2pdKTsKCQlqKys7Cgl9CglpbnQgcD12LnNpemUoKTsKCXYucmVzaXplKHMpOwoJd2hpbGUoKGk+PWxvdykmJighc2VhcmNoKHYsc3RyW2ldKSkpCgl7CgkJdi5wdXNoX2JhY2soc3RyW2ldKTsKCQlpLS07Cgl9CglpbnQgcT12LnNpemUoKTsKCXJldHVybiBtYXgocCxxKTsKCQp9CmludCBmdW4oY2hhciBzdHJbXSxpbnQgbG93LGludCBoaWdoKQp7CglpZihsb3c9PWhpZ2gpCgkgICAgcmV0dXJuIDE7CglpZihoaWdoLWxvdz09MSkKCSAgICByZXR1cm4gc3RyW2xvd109PXN0cltoaWdoXT8xOjI7CglpbnQgbWlkPShsb3craGlnaCkvMjsKCXJldHVybiBtYXgoZnVuKHN0cixsb3csbWlkLTEpLAoJICAgICAgICAgICBmdW4oc3RyLG1pZCsxLGhpZ2gpLAoJCQkgICBjcm9zc2luZ19taWQoc3RyLGxvdyxtaWQsaGlnaCkpOwp9CmludCBtYWluKCkKewoJY2hhciBzdHJbXT0iZ2Vla3Nmb3JnZWVrcyI7Cgljb3V0PDxmdW4oc3RyLDAsc3RybGVuKHN0ciktMSk8PCIgaXMgdGhlIG1heCBub24gcmVwZWF0b25nIHN1YnN0cmluZy5cbiI7CglyZXR1cm4gMDsKfQ==