#include<string>
#include<iostream>
#include<stdlib.h>
using namespace std;
void buildMatch(string pattern, int *& match){
int m = pattern.size();
match = (int*)malloc(m * sizeof(int));
match[0] = -1;
int i;
for(int j = 1; j < m; j++){
i = match[j-1];
while((i >= 0) && (pattern[j] != pattern[i+1])){
i = match[i];
}
if(pattern[j] == pattern[i + 1]){
match[j] = i + 1;
}else{
match[j] = -1;
}
}
}
int kmp(string str, string pattern, int *match){
int m = str.size();
int n = pattern.size();
int i = 0,j = 0;
buildMatch(pattern, match);
while(i < m && j < n){
if(str[i] == pattern[j]){
i++;
j++;
}else if(j > 0){
j = match[j-1] + 1;
}else{
i++;
}
}
return (j == n)? (i - n) : -1;
}
int main(){
int * match;
string str2="abcabcacab";
string str1 ="dhsuidhauiabcabcacab9jwd";
//for(int i = 0; i < str2.size(); i++){
// cout << match[i] << " " ;
// }
cout << kmp(str1, str2, match);
}