Cod sursa(job #1755299)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 9 septembrie 2016 19:54:38
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include  <fstream>
#include <algorithm>
using namespace std;
struct kml
{
    int a,b;
};
kml w[17000];
int n,k,st,dr,m,i,p1,p2,j,p,maxi;
char v[17000];
bool compara(kml A, kml B)
{
    if(A.a!=B.a) return A.a>B.a;
    else return A.b>B.b;
}
int val(int e)
{
    p1=1;
    p2=1;
    w[0].a=0;
    w[0].b=0;
    for(i=0; i<e; i++)
    {
        w[0].a=(w[0].a*26+(v[i]-'a'))%1000117;
        w[0].b=(w[0].b*26+(v[i]-'a'))%100109;
        p1=(p1*26)%1000117;
        p2=(p2*26)%100109;
    }
    for(j=1; j+e<=n; j++)
    {
        w[j].a=(w[j-1].a*26-(p1*(v[j-1]-'a'))%1000117+(v[j+e-1]-'a')+1000117)%1000117;
        w[j].b=(w[j-1].b*26-(p2*(v[j-1]-'a'))%100109+(v[j+e-1]-'a')+100109)%100109;
    }
    sort(w,w+j,compara);
    p=1;
    maxi=1;
    for(i=1; i<j; i++)
    {
        if(w[i].a==w[i-1].a&&w[i].b==w[i-1].b) p++;
        else
        {
            if(maxi<p) maxi=p;
            p=1;
        }
    }
    return maxi;
}
int main()
{
    ifstream f("substr.in");
    ofstream g("substr.out");
    f>>n>>k;
    f>>v;
    st=1;
    dr=n;
    while(st+1<dr)
    {
        m=(st+dr)/2;
        if(val(m)<k) dr=m;
        else st=m;
    }
    if(val(dr)>=k) st=dr;
    g<<st<<'\n';
    f.close(); g.close();
    return 0;
}