神奇的KMP

非常好的KMP题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int M=200005;
 4 int m,n,k,p,la,lb;
 5 int kmp[M],ans[M];
 6 char a[M],b[M];
 7 void getkmp()
 8 { int j=0;
 9  for (int i=2;i<=lb;i++)
10  { while (j&&b[j+1]!=b[i]) j=kmp[j];
11    if (b[j+1]==b[i]) j++;
12    kmp[i]=j;
13   }
14 }
15 void KMP()
16 { int j=0;
17   for (int i=1;i<=la;i++)
18   { while (j&&b[j+1]!=a[i]) j=kmp[j];
19     if (b[j+1]==a[i]) j++;
20     ans[j]++;
21   }
22 }
23 int main()
24 { scanf("%d%d%d",&la,&lb,&k);
25   cin>>(a+1);
26   cin>>(b+1);
27   getkmp();
28   KMP();
29   for (int i=lb;i>0;i--) ans[kmp[i]]+=ans[i];
30   for (int i=0;i<=lb;i++) ans[i]-=ans[i+1];
31   for (int i=1;i<=k;i++)
32   { scanf("%d",&p);
33     printf("%d\n",ans[p]);
34   }
35   return 0;
36 }

具体什么思想hale还在大力思考

总之先当成模板背着吧

posted @ 2019-01-05 19:38  Shine_hale  阅读(121)  评论(0编辑  收藏  举报
Live2D