标签:
1 3 4 daababac
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 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4415503.html