http://poj.org/problem?id=1200
题意:查找一个字符串中有多少不同的长度为N的子字符串
分析:可以将子字符串转换成HC进制数,这样就可以唯一标识,用hash
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int NUM=16000005;
int hash[NUM];
char str[NUM];
int main()
{
int a[150],n,count,num,j,i,len,N,NC;
while(scanf("%d%d",&N,&NC)!=EOF)
{
memset(hash,0,sizeof(hash));
memset(a,0,sizeof(a));
scanf("%s",str);
len=strlen(str);
n=1;
count=0;
for(i=0;i<len;i++)
{
if(a[str[i]-'a']==0)
a[str[i]-'a']=n++;
if(n==NC) break;
}
for(i=0;i<=len-N;i++)
{
num=0;
for(j=i;j<i+N;j++)
{
num=num*NC+a[str[j]-'a'];
}
if(!hash[num])
{hash[num]=1;count++;}
}
printf("%d\n",count);
}
return 0;
}