poj 1200 Crazy Search 哈希
简单的哈希的题目注意题目已经说明所有的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; }
补充:软件开发 , C++ ,