您的位置:首页 > 其它

【bzoj 3670】 [Noi2014]动物园 KMP变式

2016-09-27 19:13 405 查看
num数组让记录前缀后缀相同且不重复的数的个数,因为有限制条件,前后不能重复,所以匹配的时候如果有重复的也算是匹配失败。

然后是记录方案,考虑在没有约束条件时,记录方案时每次可以从上次失配的地方转移,有约束条件是同理。

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int n, m;
char a1[1000010];
int f[1000010], num[1000010];
inline int mul(int a, int b){
int ans = 0;
for(;b;b>>=1,a=(a*2)%mod) if(b&1) ans = (ans+a)%mod;
return ans;
}
int main(){
scanf("%d", &n);
while(n --){
scanf("%s", a1+1);
m = strlen(a1+1);
for(int i = 1; i <= m; i ++) f[i]=0;
int p = 0, ans = 1;
num[1] = 1;
for(int i = 2; i <= m; i ++){
while(p && a1[p+1]!=a1[i]) p = f[p];
if(a1[p+1] == a1[i]) p ++;
f[i] = p;
num[i] = num[p]+1;
}
p = 0;
for(int i = 2; i <= m; i ++){
while(p && (a1[p+1]!=a1[i] || i<2*p+2)) p = f[p];
if(a1[p+1] == a1[i]) p ++;
ans = mul(ans, num[p]+1);
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  noi bzoj kmp 字符串