Cod sursa(job #1923189)

Utilizator geo_furduifurdui geo geo_furdui Data 10 martie 2017 21:18:21
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include<algorithm>
using namespace std;
ifstream cin ("substr.in");
ofstream cout ("substr.out");
char s[20010];
int n,k,m;
int sol[20][20010];
struct bla
{
    int start,done,crt;
} l[20010];
void read ()
{
    cin>>n>>k>>s;
    int r=1;
    while(r<n) r*=2,m++;
}
void up_date (int power,int poz)
{
    l[poz].start=sol[power][poz];
    l[poz].crt=poz;
    int y=1<<power;  y+=poz;
    if(y<n) l[poz].done=sol[power][y]; else l[poz].done=-1;
}
bool sortare (bla q,bla w)
{
    if(q.start==w.start) return q.done<w.done;
    return q.start<w.start;
}
void init ()
{
    for(int i=0;i<n;i++)
         l[i].start=s[i],l[i].crt=i;
         sort(l,l+n,sortare);
     sol[0][l[0].crt]=0; int nr=0;
        for(int j=1;j<n;j++)
        {
            if(l[j].start!=l[j-1].start || l[j].done!=l[j-1].done) nr++;
            sol[0][l[j].crt]=nr;
        }
}
void construct ()
{
    for(int i=1;i<=m;i++)
    {
        for(int j=0;j<n;j++)
            up_date(i-1,j);
        sort(l,l+n,sortare);
        sol[i][l[0].crt]=0; int nr=0;
        for(int j=1;j<n;j++)
        {
            if(l[j].start!=l[j-1].start || l[j].done!=l[j-1].done) nr++;
            sol[i][l[j].crt]=nr;
        }
    }
}
int lcp (int p1,int p2)
{
    int rez=0,p3=p1,p4=p2;
    if(p1==p2) return n-p1+1;
    for(int i=m;i>=0;i--)
    {
        int y=1<<i;
        if(sol[i][p1]==sol[i][p2])
            p1+=y,p2+=y,rez+=y;
    }
    if(n-p3<rez) rez=n-p3;
    if(n-p4<rez) rez=n-p4;
    return rez;
}
void solve ()
{ int maxim=0;
for(int i=0;i<n;i++)
    l[sol[m][i]].crt=i;
    for(int i=0;i<n-k;i++)
        maxim=max(maxim,lcp(l[i].crt,l[i+k-1].crt));
        cout<<maxim;
}
int main()
{
    read();
    init();
    construct();
    solve();
    cin.close();
    cout.close();
    return 0;
}