給定一個字符串,其中含有不同的字母數量爲m,現在求這個字符串中有多少個長度爲n且長的互不相同的字符子串
舉個例子, n=3, m=4 ,字符串 "daababac". 長度爲3的不同的子串分別是: "daa"; "aab"; "aba"; "bab"; "bac". 因此, 答案是5.
Input
第一行是兩個整數n,m,,一個空格隔開。 接下來一行是我們要解決的字符串.( 你可以認爲字符串的長度不會超過一千六百萬。)Orz我讀錯題了,並不是字符串長度不超過1600萬,是合理hash之後的hash的值不超過1600萬。Orz原諒我
Output
程序應該輸出一個整數,對應於給定文本中所找到的大小爲n的不同子字符串的數量。
輸入數據
3 4 daababac
輸出數據
5
Hint
輸入數據量龐大,推薦使用scanf
解題思路:進制哈希,將串中每一個字母用一個N進制的基數表示,然後求出長度爲n的子串的十進制哈希值
AC代碼:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=2e7;
int hash[maxn],num[300];
char a[maxn];
int main()
{
int m,n;
scanf("%d%d%s",&n,&m,a);
int len=strlen(a);
int cnt=0,ans=0;
for(int i=0;i<len;i++)
{
if(!num[a[i]])
num[a[i]]=cnt++;
}
for(int i=0;i<=len-n;i++)
{
int term=0;
for(int j=0;j<n;j++)
{
term=term*cnt+num[a[i+j]];
}
if(!hash[term])
{
ans++;
hash[term]=1;
}
}
printf("%d\n",ans);
return 0;
}