poj 1200(字符串哈希)

来源:互联网 发布:时方英语复读机软件 编辑:程序博客网 时间:2024/06/16 09:18

一开始直接开了map,不知道要用字符串哈希。  果断TLE,   其实一共nc个字符,让每个字符对应一个0-nc的数字,则不同的长度为n的字串哈希值也不同,就是以nc为进制,不同的以数字0-nc的长度为n的数字组合唯一。

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>using namespace std;char s[27000000];int vis[300];int vi[27000000];int a[300];int main(){    int n,nc;    scanf("%d%d",&n,&nc);    //cout<<"ejjejje"<<endl;    scanf("%s",s);    int len=strlen(s);    for(int i=0;i<len;i++)    {        vis[s[i]]=1;    }    int t=0;    int sum=0;    for(int i=0;i<300;i++)    {        if(vis[i]==1)            a[i]=t++;    }    //cout<<"ejejje"<<endl;    //cout<<"t:"<<t<<endl;    int x;    for(int i=0;i<=len-n;i++)    {        x=0;        for(int j=i;j<i+n;j++)        {            x=x*nc+a[s[j]];        }        if(vi[x]==0)        {            sum++;            vi[x]=1;        }    }    cout<<sum<<endl;    return 0;}


原创粉丝点击