您的位置:首页 > 其它

BZOJ3670: [Noi2014]动物园(洛谷P2375)

2018-03-05 21:03 357 查看

KMP

BZOJ题目传送门

洛谷题目传送门

感觉洛谷标签高了点啊。。。

第一遍处理出next数组,另记一个数组干脆就叫 num表示题目中的num的可重叠版(就是前后缀可重叠的数量)。再类似求next一样跳一遍,加上限制后统计答案就好了。

我之前从0开始的KMP简直有毒

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
using namespace std;
const int MOD=1e9+7;
int t,n,nxt
,num
;
char s
;
int main(){
for (scanf("%d",&t);t;t--){
memset(nxt,0,sizeof(nxt));
memset(num,0,sizeof(num));
scanf("%s",s+1),num[1]=1;
for (int i=2,nd=0;s[i];nxt[i++]=nd){
while (nd&&s[nd+1]!=s[i]) nd=nxt[nd];
if (s[nd+1]==s[i]) nd++; num[i]=num[nd]+1;
}
long long ans=1;
for (int i=2,nd=0;s[i];i++){
while (nd&&s[nd+1]!=s[i]) nd=nxt[nd];
if (s[nd+1]==s[i]) nd++;
while ((nd<<1)>i) nd=nxt[nd];//跳到长度<=i/2为止
(ans*=num[nd]+1)%=MOD;
}
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: