实现字符串和从0到n-1范围内的数字串的一一对应---->poj1200
1 #include<iostream> 2 using namespace std; 3 const int maxn=1e6+5; 4 int num[maxn]; 5 string s; 6 int main() 7 { 8 int nc;//字符串s中不同字符的个数 9 cin>>s>>nc; 10 int len=s.length(); 11 12 int cnt=1; 13 num[s[0]]=0; 14 for(int i=1;i<len;i++) 15 { 16 if(num[s[i]]==0) 17 { 18 num[s[i]]=cnt++; 19 } 20 if(cnt==nc) 21 { 22 break; 23 } 24 } 25 26 for(int i=0;i<len;i++) 27 { 28 cout<<num[s[i]]; 29 } 30 cout<<endl; 31 }
在这个基础上,完成crazy search
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; int num[300]; int Hash[16000009];//hash函数 int main() { int n,nc; string str; while(~scanf("%d%d",&n,&nc)) { memset(Hash,0,sizeof(Hash)); cin>>str; int len=str.length(); int cnt=1; num[str[0]]=0; for(int i=1; i<len; i++) //将nc个字符转换为对应的nc进制的数,字母和数字是一一对应的 { if(num[str[i]]==0)//只有当这个字符没有转换过的时候,才将该字符对应成一个数字 { num[str[i]]=cnt; cnt++; } if(cnt==nc) break; } //注重端点,最后一个端点起点从len-n开始,终点在len-1 int ans=0,sum; for(int i=0; i<=len-n; i++)//等号!!!!!! { sum=0; for(int j=i; j<i+n; j++) { sum=sum*nc+num[str[j]];//特别要注意这里因为是nc进制的计算所以乘上的是nc,不要因为我们习惯的十进制计算而乘上10 } //这样每一个长度为n的不同的子串都会唯一的对应一个数字 if(Hash[sum]==0) { Hash[sum]=1; ans++; } } printf("%d\n",ans); } return 0; }