实现字符串和从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;
}
浙公网安备 33010602011771号