题目链接:http://poj.org/problem?id=1200
题意:
N是子串的长度,NC是原串中所含的不同字母的个数,求的是text中长度为N的不相同的子串有多少个。
题解:
hash水题,直接hash成NC进制就好。
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 1.6e7+7;
char str[MAXN];
int hash_[107];
bool flag[MAXN];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(hash_,0,sizeof(hash_));
memset(flag,0,sizeof(flag));
scanf("%s",str);
int len=strlen(str);
int num=0;
for(int i=0; i<len; ++i)
{
if(!hash_[str[i]])
hash_[str[i]]=++num;
if(num==m)break;
}
int ans=0;
for(int i=0; i<len-n+1; ++i)
{
int temp=0;
for(int j=i; j<i+n; ++j)
temp=temp*m+hash_[str[j]];
if(!flag[temp])++ans,flag[temp]=1;
}
printf("%d\n",ans);
}
return 0;
}