[BZOJ3670][Noi2014]动物园 && KMP
2015-04-16 01:25
295 查看
不要问我为什么不从s开始读 我试了N久没试出来 然后用s+1开始读就爽爽哒
在构造fail数组之后递推构造num数组(与题目有所不同的是这里的num指的是由当前位置失匹num次后会回到1) 假设某个fail值的位置j 并且j*2 > i 说明肯定有重复的部分 继续寻找前一个fail值
在构造fail数组之后递推构造num数组(与题目有所不同的是这里的num指的是由当前位置失匹num次后会回到1) 假设某个fail值的位置j 并且j*2 > i 说明肯定有重复的部分 继续寻找前一个fail值
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> #include<set> #define SF scanf #define PF printf using namespace std; typedef long long LL; const int MAXN = 1000000; const int MOD = 1000000007; char s[MAXN+10]; int f[MAXN+10], num[MAXN+10], n, ans; void GetFail() { num[1] = 1; int fail = 0; for(int i = 2; i <= n; i++) { while(fail && s[fail+1] != s[i]) fail = f[fail]; if(s[fail+1] == s[i]) fail++; f[i] = fail; num[i] = num[fail]+1; } fail = 0; for(int i = 2; i <= n; i++) { while(fail && s[fail+1] != s[i]) fail = f[fail]; if(s[fail+1] == s[i]) fail++; while( (fail << 1) > i && fail) fail = f[fail]; ans = 1LL * ans * (num[fail]+1) % MOD; } } int main() { int _T; SF("%d", &_T); while(_T--) { ans = 1; SF("%s", s+1); n = strlen(s+1); GetFail(); PF("%d\n", ans); } }
相关文章推荐
- [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]
- BZOJ 3670: [Noi2014]动物园 KMP
- bzoj3670: [Noi2014]动物园 KMP
- 【 bzoj 3670 】 [Noi2014]动物园 - KMP
- 【KMP】BZOJ3670-[Noi2014]动物园
- 【BZOJ】3670 [Noi2014]动物园 KMP
- [BZOJ3670][Noi2014]动物园 KMP
- 【BZOJ3670】【NOI2014】动物园 KMP变形 线性出解
- BZOJ3670 NOI2014 动物园 题解&代码
- BZOJ3670 [Noi2014]动物园 【KMP计数】
- 【BZOJ3670】【NOI2014】动物园 [KMP][倍增]
- 【NOI 2014】【BZOJ 3670】动物园 题解&代码(C++)
- [BZOJ3670][NOI2014]动物园(KMP)
- 【bzoj3670】[Noi2014]动物园 KMP-next数组
- BZOJ 3670: [Noi2014]动物园(kmp+递推)
- BZOJ 3670: [Noi2014]动物园【KMP变形 】
- 【BZOJ3670】[Noi2014]动物园【KMP】【fail树】
- bzoj 3670: [Noi2014]动物园 KMP
- bzoj3670 NOI2014 动物园 kmp
- 【bzoj3670】【NOI2014】【动物园】【kmp+dp】