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;
}

posted @ 2010-08-29 21:26  菜到不得鸟  阅读(271)  评论(0)    收藏  举报