1 /**************************************************
2 Target: kmp function
3 Author: Xue Zhonghao
4 Date: 2014-2-28 19:28:17
5 **************************************************/
6
7 #include<cstdio>
8 #include<cstdlib>
9 #include<string>
10 #include<iostream>
11 using namespace std;
12
13 #define max_length 2000
14
15 void getFail(string a, int *f)//失配函数
16 {
17 int m = a.length();
18 f[0] = 0, f[1] = 0;//递推边界初值
19 for(int i = 0; i < m; i++){
20 int j = f[i];
21 while(j && a[i]!=a[j]) j = f[j];
22 f[i+1] = (a[i]==a[j])?(j+1):(0);
23 }
24 }
25
26 int kmp(string a, string b, int *f)
27 {
28 int n = a.length(), m = b.length();
29 getFail(b, f);
30 int j = 0; //当前节点编号
31 for(int i = 0; i < n; i++){ //模板当前指针
32 while(j && a[i]!=b[j]) j = f[j]; //顺失配边寻找匹配(到0为止)
33 if(a[i] == b[j]) ++j;
34 if(j == m) return i-m; //输出
35 }
36 return -1;
37 }
38
39 int main(void)
40 {
41 string a, b;//a模板,b子串
42 int ans;
43 int f[max_length];
44 cin>>a>>b;
45 ans = kmp(a, b, f);//kmp函数,返回子串第一次在模板中出现的位置,若没有答案返回-1
46 if(ans == -1) cout<<"NO ANSWER"<<endl;
47 else cout<<ans<<endl;
48 system("pause");
49 return 0;
50 }