Cod sursa(job #349120)

Utilizator hendrikHendrik Lai hendrik Data 18 septembrie 2009 09:33:36
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <iostream>
#include <map>
using namespace std;

#define MOD1 31379
#define MOD2 3911
#define MAXN 16500

int n,len,lo,hi,ans;
char mat[MAXN];

bool can(int a){
    map<int,int>mp;
    int hash1,hash2,sub1,sub2;
    hash1=hash2=0;
    sub1=sub2=1;
    for (int i=0;i<a;i++){
        hash1=hash1*MOD1+mat[i];
        hash2=hash2*MOD2+mat[i];
        sub1*=MOD1;
        sub2*=MOD2;
    }
    mp[hash1*2+hash2]++;
    for (int i=a;i<n;i++){
        hash1=hash1*MOD1-sub1*mat[i-a]+mat[i];
        hash2=hash2*MOD2-sub2*mat[i-a]+mat[i];
        mp[hash1*2+hash2]++;
        if (mp[hash1*2+hash2]>=len) return 1;
    }
    return 0;
}

void open(){
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
}

int main(){
    //open();
    scanf("%d%d",&n,&len);
    gets(mat);
    gets(mat);
    lo=0;hi=n;
    while (1){
        int mid=(lo+hi)/2;
        if (can(mid)){
            ans=mid;
            lo=mid+1;
        }
        else {
            hi=mid-1;
        }
        if (lo>hi) break;
    }
    printf("%d\n",ans);
    //system("pause");
    return 0;
}