Crazy Search
64-bit integer IO format: %I64d Java class name: Main
Your task is to write a program that given the size, N, of the substring, the number of different characters that may occur in the text, NC, and the text itself, determines the number of different substrings of size N that appear in the text.
As an example, consider N=3, NC=4 and the text "daababac". The different substrings of size 3 that can be found in this text are: "daa", "aab", "aba", "bab", "bac". Therefore, the answer should be 5.
Input
Output
The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.
The output format consists of N output blocks. There is a blank line between output blocks.
Sample Input
1 3 4 daababac
Sample Output
5
解题:很犀利的hash大法


1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int maxn = 16000010; 6 int bs[256],cnt,n,base,ans,T; 7 char str[1000010]; 8 bool hs[maxn]; 9 int main() { 10 scanf("%d",&T); 11 while(T--) { 12 scanf("%d%d%s",&n,&base,str); 13 int len = strlen(str); 14 memset(hs,false,sizeof(hs)); 15 for(int i = cnt = 0; i < len; ++i) 16 if(!bs[str[i]]) { 17 bs[str[i]] = cnt++; 18 if(cnt == base) break; 19 } 20 for(int i = ans = 0; i + n <= len; ++i) { 21 unsigned int hashV = 0; 22 for(int j = 0; j < n; j++) 23 hashV = hashV*base + bs[str[i+j]]; 24 if(!hs[hashV]) { 25 hs[hashV] = true; 26 ans++; 27 } 28 } 29 printf("%d\n",ans); 30 if(T) puts(""); 31 } 32 return 0; 33 }