您的位置:首页 > 其它

bzoj3670: [Noi2014]动物园 KMP

2014-09-26 01:08 246 查看
kmp位置一直用一个数j来表示比较好。。。
/**************************************************************
Problem: 3670
User: xujiahe
Language: C++
Result: Accepted
Time:684 ms
Memory:10068 kb
****************************************************************/

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define maxn 1001000
#define ll long long
char str[maxn];
int len,next[maxn];
int cal[maxn];
void solve()
{
// memset(cal,0,sizeof(cal));
// memset(next,0,sizeof(next));
len=strlen(str);
next[1]=0;
cal[1]=1;
int j=0;
for(int i=1;i<len;i++)
{
while(j&&str[i]!=str[j])
{
j=next[j];
}
if(str[i]==str[j])
{
j++;
}
next[i+1]=j;
cal[i+1]=cal[j]+1;
}
/*
for(int i=1;i<=len;i++)
{
printf("%d %d\n",next[i],cal[i]);
}
*/
ll ans=1;
j=0;
for(int i=1;i<len;i++)
{
while(j&&str[j]!=str[i] ) j=next[j];
if(str[j]==str[i]) j++;
while( (j<<1) > (i+1) ) j=next[j];
ans*=cal[j]+1;
ans%=1000000007;
}
printf("%lld\n",ans);
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%s",str);
solve();
}
return 0;
}
/*
3
aaaaa
ab
abcababc
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: