您的位置:首页 > 其它

hdu3336(next数组的应用)

2016-07-26 17:02 190 查看
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=200002;
int Next[200002];
char t[200002];
int tlen;
int num[200002];
void MakeNext()
{
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];
}
}
//next数组返回的是如果模式串位置k处字符与主串字符不匹配
//则主串该处的字符应该与模式串以next[k]为下标的字符比较
//next[k]其实也是k处前与主串匹配的字符串的长度
int main()
{

int n;
scanf("%d",&n);
while(n--)
{
scanf("%d",&tlen);
scanf("%s",t);
MakeNext();
long long sum=0;
memset(num,0,sizeof(num));
for(int i=1;i<=tlen;i++)
{
int tmp=Next[i];
while(tmp!=0)
{
num[tmp]++;//字符串长度为tmp的串匹配次数++
tmp=Next[tmp];
}
}
for(int i=0;i<tlen;i++)
{
sum=(sum+num[i]+1)%10007;//加上自己与自己匹配的1次
}
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: