您的位置:首页 > 其它

3670: [Noi2014]动物园

2016-04-30 08:32 281 查看
kmp维护两个指针,记录cnt表示能向前跳几步

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000005;
ll ans=1;int p[maxn],cnt[maxn],T,n;char s[maxn];

int main(){//freopen("in.in","r",stdin);
scanf("%d",&T);
while(T--){ans=1;
scanf("%s",s+1);
p[0]=p[1]=cnt[0]=0;cnt[1]=1;
n=strlen(s+1);
int f=0,ff=0;
for(int i=2;i<=n;i++){
while(f && s[f+1]!=s[i])f=p[f];
if(s[f+1]==s[i])f++;  //
p[i]=f;
cnt[i]=cnt[f]+1;
while(ff && s[ff+1]!=s[i])ff=p[ff];
if(s[ff+1]==s[i])ff++;
while(ff && (ff<<1)>i)ff=p[ff];
ans*=(cnt[ff]+1);
ans%=1000000007;
}
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: