Cod sursa(job #1061933)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 20 decembrie 2013 14:57:40
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;
vector<pair<char,int> >I;
vector<pair<int,int> >F;
vector<pair<pair<int,int>,int> >Q;
int n,k,L[20][20010],cnt,j,i,a,b,lg,SOL,compara(int,int);
char S[20010];

int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d%d",&n,&k);
    scanf(" %s",S);
    for(i=0;i<n;i++)
        I.push_back(make_pair(S[i],i));
    sort(I.begin(),I.end());
    vector<pair<char,int> >::iterator it=I.begin();
    L[0][it->second]=cnt=1;
    for(vector<pair<char,int> >::iterator jt=I.begin()+1;jt!=I.end();jt++,it++)
    {
        if(jt->first!=it->first)cnt++;
        L[0][jt->second]=cnt;
    }
    for(i=2,lg=1;i<=n+n;i<<=1,lg++)
    {
        Q.resize(0);
        for(j=0;j<n;j++)
        {
            a=L[lg-1][j];
            if((j+(i>>1))>=n)b=0; else b=L[lg-1][j+(i>>1)];
            Q.push_back(make_pair(make_pair(a,b),j));
        }
        sort(Q.begin(),Q.end());
        vector<pair<pair<int,int>,int> >::iterator lt=Q.begin();
        lt=Q.begin();
        L[lg][lt->second]=cnt=1;
        for(vector<pair<pair<int,int>,int> >::iterator rt=Q.begin()+1;rt!=Q.end();rt++,lt++)
        {
            if((*lt).first.first!=(*rt).first.first || (*lt).first.second != (*rt).first.second)cnt++;
            L[lg][rt->second]=cnt;
        }
    }
    lg--;
    for(j=0;j<n;j++)F.push_back(make_pair(L[lg][j],j));
    sort(F.begin(),F.end());
    vector<pair<int,int> >::iterator aul=F.begin();
    vector<pair<int,int> >::iterator aur=F.begin()+k-1;
    for(;aur<F.end();aul++,aur++)
        SOL=max(SOL,compara(aul->second,aur->second));
    printf("%d\n",SOL);
}
int compara(int X,int Y)
{
    int res=0;
    while(X<n && Y<n)
    {
        if(S[X]!=S[Y])break;
        res++;
        X++;Y++;
    }
    return res;
}