一开始直接开了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;
}