实现字符串和从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;
}

  

猜你喜欢

转载自www.cnblogs.com/dragondragon/p/12330973.html