【BZOJ3620】似乎在梦中见过的样子 KMP

链接:#include <stdio.h>int main(){puts(“转载请注明出处[vmurder]谢谢”);puts(“网址:blog.csdn.net/vmurder/article/details/44500477”);}题解:

对于一个区间为结尾的等长串,那么这个区间就是一个可行串。

我们枚举区间左端点,然后可以利用KMP在线性的时间内处理完所有的右端点对答案的贡献。

代码:;int pre[N],fix,n,m,ans;char s[N];int main(){freopen(“test.in”,”r”,stdin);int i,j,k;scanf(“%s%d”,s+1,&m);n=strlen(s+1);int uplimit=n-m-m;for(k=0;k<uplimit;k++){// 数组右移k位for(fix=0,i=2;i+k<=n;i++){while(fix&&s[i+k]!=s[fix+1+k])fix=pre[fix];if(s[i+k]==s[fix+1+k])fix++;pre[i]=fix;}for(fix=0,i=m+1;i+k<=n;i++){while(fix&&s[i+k]!=s[fix+1+k])fix=pre[fix];if(s[i+k]==s[fix+1+k])fix++;while(fix<<1>=i)fix=pre[fix];if(fix>=m)ans++;}}printf(“%d\n”,ans);return 0;}

,每个人在他的人生发轫之初,总有一段时光,

【BZOJ3620】似乎在梦中见过的样子 KMP

相关文章:

你感兴趣的文章:

标签云: