您的位置:首页 > 其它

BZOJ3670(Noi2014)[动物园]--KMP

2017-12-02 10:44 281 查看
【链接】

bzoj3670

【解题报告】

好像题目自己说是KMP。。。

就只需要判断一下失配指针的位置是否超过长度一半就行了。

#include<cstdio>
#define LL long long
using namespace std;
const int maxn=1000005,tt=1000000007;
int T,len,a[maxn],p[maxn];
LL ans;
char s[maxn];
void Readc()
{
char ch=getchar(); len=0;
while (ch<'a'||ch>'z') ch=getchar();
while (ch>='a'&&ch<='z') s[++len]=ch,ch=getchar();
}
void Work()
{
Readc(); ans=1; p[0]=p[1]=a[0]=0; a[1]=1;
for (int i=2,k1=0,k2=0; i<=len; i++)
{
while (k1&&s[k1+1]!=s[i]) k1=p[k1];
if (s[k1+1]==s[i]) k1++;
p[i]=k1; a[i]=a[k1]+1;
while (k2&&s[k2+1]!=s[i]) k2=p[k2];
if (s[k2+1]==s[i]) k2++;
while (k2>(i>>1)) k2=p[k2];
ans=(LL)ans*(a[k2]+1)%tt;
}
printf("%d\n",ans);
}
int main()
{
freopen("3670.in","r",stdin);
freopen("3670.out","w",stdout);
scanf("%d",&T);
while (T--) Work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: