题目链接:http://poj.org/problem?id=1200
题目大意:找不同的子串
题目分析:多不错的水题,适合我等菜鸟拉。转化为nc的进制,意味着有ans个不同个数
代码:
#include<cstdio> #include<cstdlib> #include<cstring> const int maxn=16*1e6+5; using namespace std; char string[maxn]; int letter[30]; bool hash [20000000]; long long sum; int main() { int n,nc,i,j,ans,len,count; while(scanf("%d %d",&n,&nc)==2) { scanf("%s",string);ans=0,count=1; len=strlen(string); memset(hash,false,sizeof(hash)); memset(letter,0,sizeof(letter)); for(i=0;i<=len-n;i++) { sum = 0; for(j=i;j<i+n;j++) { if(!letter[string[j]-'a']) letter[string[j]-'a']=count++; sum*=nc;sum+=letter[string[j]-'a']; } if(!hash[sum]){hash[sum]=true;ans++;} } printf("%d\n",ans); } return 0; }