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;
}