/*所谓kmp算法,有很多衍生,但是基础就是next表,字符串有n位,next数组就有n+1位;
如“aabc”,next[0]=-1,第一个不重合只能向后移一位;next[1]=0,前面只有一个字符;
next[2]=1,'a'=='a';next[3]=0,'a'!='b','aa'!='ab';同理,next[4]=0;*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 200010;
const int mod = 10007;
char s[maxn];
int t,n,next1[maxn];
int num[maxn];
void pre_next()
{
int k = -1;
int i = 0;
next1[i] = k;
while(i < n)
{
if(k == -1||s[i] == s[k]){
i++;
k++;
next1[i] = k;
}
else k = next1[k];
}
//for(int i=0;i<=n;i++)
//printf("%d\n",next1[i]);
}
int main()
{
int ans = 0;
scanf("%d",&t);
while(t--)
{
ans = 0;
scanf("%d",&n);
scanf("%s",s);
pre_next();
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
num[next1[i]] = (num[next1[i]] + 1) % mod;
num[i]++;
}
for(int i=1;i<=n;i++){
printf("%d\n",num[i]);
if(num[i]) ans = (ans+num[i])%mod;
else ans = (ans+1) % mod;
}
printf("%d\n",ans);
}
return 0;
}
ACM-HDU 3336
最新推荐文章于 2021-06-15 18:35:46 发布