您的位置:首页 > 其它

POJ-1200(哈希)

2015-08-19 20:25 351 查看
2015-08-19

题意:给出两个数n,nc,并给出一个由nc种字符组成的字符串。求这个字符串中长度为n的子串有多少种。

分析:

1.这个题不用匹配,因为不高效。

2.将长度为n的子串看作n位的nc进制数,将问题转化为共有多少种十进制数字。

3.哈希时,每一个字符都对应这0---nc-1的一个数字。

代码:


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<map>
using namespace std;
const int maxn = 16e6;

char s[maxn];
unsigned int Hash[maxn];
int n,m;
int name[1000];

unsigned int hash(char *str,int x)
{
unsigned int ans = 0;
for(int i = 0; i < x; ++i)
{
ans=ans*m +name[*(str+i)];
}
return ans;
}

int main()
{
//freopen("in","r",stdin);
while(~scanf("%d%d",&n,&m))
{
scanf("%s",s);
int len = strlen(s),k = 0;
for(int i = 0; i < len; ++i)
{
if(name[s[i]] == 0) name[s[i]] = k++;
}
for(int i = 0; i <= len - n; ++i)
{
unsigned int ID = hash(s+i,n);
Hash[ID] = 1;
}
int ans = 0;
for(int i = 0; i < maxn; ++i)
ans += Hash[i];
printf("%d\n",ans);
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: