简单的哈希的题目
注意题目已经说明所有的nc个字符的排列组合的数不会超过16Million ,细节可以见代码的实现
/*********************
PRO: poj 1200
TIT: Crazy Search
DAT: 2013-08-30
AUT: UKean
EMA: huyocan@163.com
**********************/
#include<cstdio>
#include<cstring>
#define maxn 1005
bool has[16000006]={0};
int asc[300],n,nc,ans=1,tag=0,base=0,chu=1,num;
int main()
{
scanf("%d %d\n",&n,&nc);
memset(asc,-1,sizeof(asc));
//初始化字符的映射表即把nc个不同的字符对映到0到nc-1这nc个数上去,
//这样就可以得到nc进制的数了
char temp=getchar();
for(int i=0;i<n-1;i++)//用这个数对n位的nc进制数取模,以去掉它的最高位
chu*=nc;
for(int i=0;i<n;i++)//得到第一个n位的nc进制的数
{
num=(int)temp;
if(asc[num]==-1) asc[num]=tag++;
//按照出现的顺序给nc个不同字符分别标号为0到nc-1
base=base*nc+asc[num];
temp=getchar();
}
has[base]=1;
while(temp!='\n')
{
int num=(int)temp;
if(asc[num]==-1) asc[num]=tag++;
//按照出现的顺序给nc个不同字符分别标号为0到nc-1
base=(base%chu)*nc+asc[num];
if(!has[base])//产生了一个没出现过的nc进制的数
{
ans++;
has[base]=1;
}
temp=getchar();
}
printf("%d\n",ans);
return 0;
}