【NOI2014】动物园 kmp性质

对于字符串\(S\)的前\(i\)个字符构成的子串,既是它的后缀又是它的前缀的字符串中,它本身除外,最长的长度记作 \(next[i]\)
真是精炼的定义

char s[maxn];int n;
int fail[maxn];
char t[maxn];int m;
int fnd[maxn];

void getfail(){
	fail[1]=0;
	for(int i=2,j=0;i<=n;i++){
		while(j && s[i]!=s[j+1])j=f[j];
		if(s[j+1]==s[i])j++;
		f[i]=j;
	}
}
int find(){
	for(int i=1,j=0;i<=m;i++){
		while(j && (j==n || s[i]!=s[j+1]))j=fail[j];
		if(t[i]==s[j+1])j++;
		fnd[i]=j;
	}
}

具体做法参考了这里

posted @ 2018-07-10 19:33  Drenight  阅读(131)  评论(0编辑  收藏  举报