您的位置:首页 > 其它

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher K HDU 3336

2016-11-04 13:46 477 查看
题目地址:https://vjudge.net/contest/70325#problem/K

思路:先求next,如果该位置next不为0,则说明有一个字串又出现了一次,所以总答案+2,没有的话就只有该字串自身的一次,所以总答案+1。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=200000+10;
char t[maxn];
int Next[maxn],tlen;

void getNext()
{
int j,k;
j=0,k=-1,Next[0]=-1;
while(j<tlen)
{
if(k==-1 || t[j]==t[k])
Next[++j]=++k;
else
k=Next[k];
}
}

int main()
{
int caset;
scanf("%d",&caset);
while(caset--)
{
scanf("%d",&tlen);
scanf("%s",t);
getNext();
int ans=0;
for(int i=1;i<=tlen;i++)
{
ans+=Next[i]?2:1;
ans%=10007;
}

printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: