题目链接
题意:
给定一个字符串,其中含有不同的字母数量为m,现在求这个字符串中有多少个长度为n且长的互不相同的字符子串
举个例子, n=3, m=4 ,字符串 "daababac". 长度为3的不同的子串分别是: "daa"; "aab"; "aba"; "bab"; "bac". 因此, 答案是5.
思路:
这里没有给N、M的范围,但是要知道字符串的数量最多是255(还不知是256),所以我们开了个300的数组记录对应字符的相应哈希值,然后我们去遍历这样的字符,暴力就是了,每次查询其1~N的字符是否对应的哈希值出现过,没有就记录下来,这里用不了set,会超时。。。
完整代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN=1e6+5;
int N, M;
char s[maxN];
int tot, mp[300], sum;
bool vis[16000005];
void init()
{
memset(vis, false, sizeof(vis));
memset(mp, 0, sizeof(mp));
}
int main()
{
while(scanf("%d%d", &N, &M)!=EOF)
{
init();
getchar();
scanf("%s", s);
int len=(int)strlen(s);
if(len<N) { printf("0\n"); continue; }
for(int i=0; i<len; i++)
{
if(!mp[s[i]]) mp[s[i]]=++tot;
if(tot==M) break;
}
int ans=0;
for(int i=0; i+N<=len; i++)
{
sum=0;
for(int j=0; j<N; j++)
{
sum=sum*M+mp[s[i+j]]-1;
}
if(!vis[sum])
{
vis[sum]=true;
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}