hdu 3336 Count the string(KMP or 不KMP)
方法1,31MS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 200005
#define MOD 10007
char str[MAXLEN];
int idx[MAXLEN];
int main()
{
int T,len,i,j,k,g;
scanf("%d",&T);
while(T--)
{
scanf("%d",&len);
scanf("%s",str);
j=0;
int count = len % MOD;
for(i=1; i<len; i++)
{
if(str[i]==str[0])
{
count=(count+1)%MOD;
idx[j++]=i;
}
}
for(i=1; i<len; i++)
{
// count++;//如果一开始不设为count=len,而设为1,则要加上这句
for(k=0,g=0; k<j && idx[k] < len; k++)
{
if(str[i]==str[ idx[k] + 1 ])
{
count=(count+1)%MOD;
idx[g++]=idx[k] + 1;
}
}
j=g;
}
printf("%d\n",count%MOD);
}
return 0;
}
//**************************************************************************
方法2,KMP,46MS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 200005
#define MOD 10007
char str[MAXLEN];
int next[MAXLEN],cnt[MAXLEN];
void getNext(int len)
{
int j=0,k=-1;
next[0]=-1;
while(j<len)
{
if( k==-1 || str[j]==str[k] )
{
j++;
k++;
next[j]=k;
}
else k=next[k];
}
}
int main()
{
int T,len,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&len);
scanf("%s",str);
getNext(len);
// for(i=0;i<=len;i++) printf("%d ",next[i]);
// printf("\n");
int sum=0;
memset(cnt,0,sizeof(*cnt)*len);
for(i = 1; i <= len; i++)
{
cnt[i] = ( cnt[ next[i] ] + 1 ) % MOD;
sum = (sum + cnt[i]) % MOD;
}
for(i=1; i<=len; i++) printf("%d ",cnt[i]);
printf("\n");
printf("%d\n",sum);
}
return 0;
}
浙公网安备 33010602011771号