KMP


 1 # include
 2 # include
 3 using namespace std;
 4 const int N = 55;
 5 int ne[N];
 6 
 7 char s[N],T[N];
 8 /*s为字串,T为主串*/
 9 int main(){
10     cin>>s+1;
11     int len = strlen(s+1);
12     for(int i = 2,j = 0;i <= len;++i){
13         while(j&&s[i] != s[j+1]) j = ne[j];
14         if(s[j+1] == s[i]){
15             j++;
16         }
17         ne[i] = j;
18     }/*next数组的构造*/
19     /*
20         整个过程在于对字串当前位置查看是否存在最长的前后缀匹配
21         当i等于2时,其前只包含1,
22         当i等于3时,此前只包含1,2
23         
24     */
25     
26     cin>>T+1;
27     int len2 = strlen(T+1);
28     for(int i = 1,j = 0;i <= len2;++i){
29         while(j && T[i] != s[j+1]) j = ne[j];
30         if(s[j+1] == T[i])j++;
31         if(j == len){
32             cout<1)+1<<endl;
33             j = ne[j];
34         }
35     }/*匹配过程,如果主串中存在字串,则输出字串的初始位置*/
36     
37     return 0;
38 }

重点还是在对于字串的最长前后缀匹配的理解,next数组的构造可以多写两组数据自己模拟两遍就理解原理了