POJ - 1200 Crazy Search

給定一個字符串,其中含有不同的字母數量爲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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章