Cod sursa(job #1054313)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 13 decembrie 2013 18:17:55
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.19 kb
#include<fstream>
#include<iostream>
#define mod 16385000
#include<unordered_map>
using namespace std;
 
 
ifstream f("substr.in");
ofstream g("substr.out");
 
unordered_map< int , int >h;
unordered_map< int ,int >::iterator it;
char a[17000];
int n,k,st,dr,mid,ans,i;
int check(  int L ) {
    h.clear();
    int Val=0;
    int baza=33;
    int mult=1;
    int dif;
     
    for(i=0;i<L;++i) {
        Val=(Val*baza+a[i])%mod;
        mult=(mult*baza)%mod;
    }
    h[Val]=1;
    if(k==1)
        return 1;
     
    for(i=L;i<n;++i) {
         
        Val=(Val*baza+a[i])%mod;
        dif=(a[i-L]*mult)%mod;
        Val=Val-dif;
        if(Val<0)
            Val+=mod;
        it=h.find(Val);
        if(it==h.end())
            h[Val]=1;
        else {
            it->second++;
            if(it->second>=k)
                return 1;
        }
    }
    return 0;
}
int main () {
     
    f>>n>>k;
     
    f>>a;
     
    st=0;dr=n;
     
    while(st<=dr) {
        mid=(st+dr)/2;
         
        if(check(mid)){ 
            ans=mid;
            st=mid+1;
        }
        else
            dr=mid-1;
    }
    g<<ans<<"\n";
    return 0;
}