【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; }
相关文章推荐
- [KMP next树] BZOJ 3670 [Noi2014]动物园
- bzoj 3670: [Noi2014]动物园 KMP
- BZOJ 3670: [Noi2014]动物园 [KMP]
- BZOJ3670【NOI2014】动物园(KMP变形)
- BZOJ 3670 NOI 2014 动物园 变形KMP
- 【bzoj3670】[Noi2014]动物园 KMP
- [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]
- BZOJ3670 [Noi2014]动物园 【KMP计数】
- BZOJ 3670: [Noi2014]动物园 KMP
- 【BZOJ3670】【NOI2014】动物园 KMP变形 线性出解
- BZOJ 3670 [Noi2014] 动物园 KMP
- [BZOJ3670][Noi2014]动物园 KMP
- BZOJ_3670_[NOI2014]_动物园_(kmp)
- 【BZOJ3670】【NOI 2014】动物园(KMP)
- BZOJ_3670_[Noi2014]动物园_KMP
- [NOI2014][BZOJ3670] 动物园|KMP
- 【KMP,next树】BZOJ3670 [Noi2014]动物园
- 【BZOJ】3670 [Noi2014]动物园 KMP
- [BZOJ3670][Noi2014]动物园 && KMP
- 【bzoj3670】[Noi2014]动物园 KMP-next数组