hdu 3460 Ancient Printer(RK算法)
#include <stdio.h>
#include <string.h>
#define MAXLEN 16000005
char str[MAXLEN];
int alpha[26];
bool exist[MAXLEN];
int main()
{
int T,n,cas,nc,len,i,j,p;
scanf("%d",&T);
for(cas=0; cas<T; cas++)
{
if(cas) printf("\n");
scanf("%d %d",&n,&nc);
memset(alpha,0,sizeof(alpha));
memset(exist,false,sizeof(exist));
scanf("%s",str);
len=strlen(str);
int cnt=0;
for(i=0; i<len; i++)
{
if(alpha[ str[i]-'a' ] == 0)
{
alpha[ str[i]-'a' ] = cnt++;
}
if(cnt==nc) break;
}
cnt=0;
for(i=0; i+n<=len; i++)
{
p=0;
for(j=i; j<i+n; j++) p = ( nc*p + alpha[ str[j]-'a' ]);
if(!exist[p])
{
exist[p]=true;
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}
浙公网安备 33010602011771号