@xzyxzy
2018-07-02T10:14:35.000000Z
字数 768
阅读 1569
字符串
表示的(最长公共前后缀)
所以如果字符串的一个为,那么可以看做是由一直循环得到的,循环节长度为
思想应用:「PKUSC2018」神仙的游戏」
这篇博客够详细了 SYC
放一个模板怕忘
求next3行,匹配三行,记得很多OJnext是关键字
//洛谷3375#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#define next haha//有些时候next是关键字using namespace std;string s1,s2;int next[1000001];int main(){cin>>s1>>s2;int len1=s1.length();int len2=s2.length();//Part 1 next数组next[0]=-1;for(int i=1;i<=len2-1;i++){int j=next[i-1];while(s2[j+1]!=s2[i]&&j!=-1)j=next[j];next[i]=s2[j+1]==s2[i]?j+1:-1;}//Part 2 匹配for(int i=0,j=0;i<len1;i++){while(j&&s1[i]!=s2[j])j=next[j-1]+1;j+=s1[i]==s2[j]?1:0;if(j==len2){printf("%d\n",i-len2+2);j=next[j-1]+1;}}//Part 3 题目要求输出nextfor(int i=0;i<=len2-1;i++)printf("%d ",next[i]+1);printf("\n");return 0;}