题解 P3375 【【模板】KMP字符串匹配】

teafrogsf

2017-07-23 09:16:14

Solution

题解里都是大神,想必他们的代码更加完美~~**比如楼下的yyb大神**~~,所以这里只是想要说一下C++党在这个题目提交的注意事项: 1、不要用玄学getline,否则直接全WA 2、用scanf注意getchar,偶尔舍弃一下string也是不错的XD 3、cincout会超时,不过可以关闭流同步(std::ios::sync\_with\_stdio(false)) 4、不要像我一样傻傻的多次执行KMP(这样是84分) 当然,代码还是要贴的,不过可能有点丑233333 ```cpp #include<iostream> #include<cstdio> #include<string> #include<cstring> #define f(i,a,b) for(i=a;i<=b;++i) int next[10010]; int m; char s[1000010],p[1010]; void get()//这个next有一点略微的不同 { int pz=strlen(p); next[0]=-1; int k=-1,j=0; while(j<pz) { //printf("%d %d\n",k,j); if(k==-1||p[j]==p[k]) { ++j,++k; next[j]=k; } else k=next[k]; } } void find()//KMP核心算法,但我感觉求next才是核心 { int i=0,j=0; int sz=strlen(s),pz=strlen(p); while(i<sz) { if(j==-1||s[i]==p[j])++i,++j; else j=next[j]; if(j==pz) { printf("%d\n",i-j+1); j=next[j]; } } } int main() { int i,j; scanf("%s",s),getchar(),scanf("%s",p); get(); find(); f(i,1,strlen(p))printf("%d ",next[i]);putchar('\n'); return 0; } ```