http://poj.org/problem?id=1200
Description
Input
Output
Sample Input
3 4 daababac
Sample Output
5
/**
poj 1200 hash
题目大意:
给定一个字符串,其中含有不同的字母数量为m,现在求这个字符串中有多少个长度为n且长的互不相同的字符子串
解题思路:
将所有不同的字母从0~m-1编号,把字符串转化为一个m进制数,作为hash的对应关系。即可以利用O(1)的时间判断。总的时间复杂度为O(n*m)
根据常识m一定是0~256之间的数,因此时间复杂度还是可以接受的。
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=16000003;
int n,m;
int hash[maxn],num[300];
char a[maxn];
int main()
{
while(~scanf("%d%d%s",&n,&m,a))
{
int len=strlen(a);
int cnt=0;
num[a[0]]=cnt++;
for(int i=1;i<len;i++)
{
if(num[a[i]]==0)
num[a[i]]=cnt++;
}
int ans=0;
for(int i=0;i<=len-n;i++)
{
int sum=0;
for(int j=0;j<n;j++)
{
sum=sum*cnt+num[a[i+j]];
}
if(!hash[sum])
{
ans++;
hash[sum]=true;
}
}
printf("%d\n",ans);
}
return 0;
}
原文:http://blog.csdn.net/lvshubao1314/article/details/42234693