http://acm.pku.edu.cn/JudgeOnline/problem?id=1200
Код:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> char txt[20000000]; long long hash[1000000]; const int prime=999983; double gold=0.618033; int n,nc; int flag; long long sum=0; int num; void insert(int p){ if(hash[p]==0){ hash[p]=sum; flag=1;} else { if(hash[p]==sum) flag=0; else insert(p%prime+1);} } int main(){ scanf("%d%d",&n,&nc); getchar(); gets(txt); int len=strlen(txt); memset(hash,0,sizeof(hash)); for(int i=0;i<=len-n;i++){ sum=0; for(int j=i;j<i+n;j++){ sum*=26; sum+=txt[j]-97;} int k=int (prime*(sum*gold-floor(sum*gold))); insert(k); if(flag) num++;} printf("%d\n",num); scanf("\n"); return 0; }