Cod sursa(job #349136)

Utilizator hendrikHendrik Lai hendrik Data 18 septembrie 2009 09:57:09
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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,tmp;
    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;
    }
    tmp=hash1*2+hash2;
    if (mp[tmp]>=len-1) return 1;
    mp[tmp]++;
    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];
        tmp=hash1*2+hash2;
        if (mp[tmp]>=len-1) return 1;
        mp[tmp]++;
    }
    return 0;
}

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

int main(){
    open();
    scanf("%d%d",&n,&len);
    scanf("%s",mat);
    lo=1;hi=n-len+1;
    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;
}