hdu 3336

KMP+dp

经典

#include<stdio.h>
#include<string.h>
#define mod 10007
char t[200010];
int next[200010];
int num[200010];
int cnt;
void get_next(char T[],int len,int next[])
{
   int i=0,j=-1;
   next[0]=-1;
   while(i<len)
   {
       if(j==-1 || T[i]==T[j])
    {
           j++;
           i++;
     next[i]=j;
    }
       else
         j=next[j];
   }
}
void main()
{
 int cas,len,i;
 scanf("%d",&cas);
 while(cas--)
 {
  memset(num,0,sizeof(num));
  cnt=0;
  scanf("%d",&len);
  scanf("%s",t);
  get_next(t,len,next);
 
  num[1]=0;
  for(i=2;i<=len;i++)
  {
    if(next[i]>0)
    num[i]=(num[next[i]]+1)%mod;
  }
   int j=0;
  for(i=2;i<=len;i++)
        j=(j+num[i])%mod;
  printf("%d\n",(j+len)%mod);
 }
}

posted on 2011-08-10 17:55  宇宙吾心  阅读(178)  评论(0)    收藏  举报

导航