class Solution {
public:
void getNext(int next[], const string & str)
{
int size=str.size();
int j=0;
next[0]=0;
for(int i=1;i<size;i++)
{
while(j>0 && str[i]!=str[j])
{
j=next[j-1];
}
if(str[i]==str[j])
{
j++;
}
next[i]=j;
}
}
int strStr(string haystack, string needle) {
if(needle.size()==0)
{
return 0;
}
int size=needle.size();
int j=0;
int next[size];
getNext(next,needle);
for(int i=0;i<haystack.size();i++)
{
while(j>0 && haystack[i]!=needle[j])
{
j=next[j-1];
}
if(needle[j]==haystack[i])
{
j++;
}
if(j==size)
{
return i-size+1;
}
}
return -1;
}
};