<题目链接>
题目大意:
给定n,nc,和一个字符串,该字符串由nc种字符组成,现在要你寻找该字符串中长度为n的子字符串有多少种。
解题分析:
因为要判重,所以讲这些字符串hash一下,将不同的字符串映射为数字,这里我们是将该字符串转化为nc进制数,不同的字符串分别对应nc进制下不同的数。
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 const int M =16e6+10; 5 char str[M]; 6 bool hash[M]; 7 int cur[256]; 8 9 int main(){ 10 int n,nc; 11 while(scanf("%d%d%s",&n,&nc,str)!=EOF){ 12 int cnt=0; 13 memset(cur,0,sizeof(cur)); 14 memset(hash,false,sizeof(hash)); 15 int len=strlen(str); 16 for(int i=0;i<len;i++){ //给所有字符都分配编号 17 if(!cur[str[i]]) 18 cur[str[i]]=++cnt; 19 if(cnt==nc)break; 20 } 21 int ans=0; 22 for(int i=0;i+n-1<len;i++){ 23 int sum=0; 24 for(int j=i;j<i+n;j++){ 25 sum+=sum*nc+cur[str[j]]; //得到该字符串转化为nc进制数的值 26 } 27 if(!hash[sum]){ 28 ++ans; 29 hash[sum]=true; 30 } 31 } 32 printf("%d ",ans); 33 } 34 return 0; 35 }
2018-10-30