Cod sursa(job #1853668)

Utilizator geo_furduifurdui geo geo_furdui Data 21 ianuarie 2017 22:19:33
Problema Substr Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include<algorithm>
using namespace std;
ifstream cin ("substr.in");
ofstream cout ("substr.out");
int n,k,sol[15][20010],m,maxim=0;
char s[20010];
struct bla
{
    int first,second,poz;
} t[20010];
void read ()
{
    cin>>n>>k>>s;
    n--;
}
int convert (char c)
{
    if(c>='0' && c<='9') return c-'0';
    if(c>='A' && c<='Z') return 10+c-'A';
    if(c>='a' && c<='z') return 10+26+c-'a';
    return 0;
}
void init ()
{
    int r=1;
    while(r<n) r*=2,m++;
    for(int i=0;i<=n;i++)
        t[convert(s[i])].poz=1;
    int nr=-1;
    for(int i=0;i<=100;i++)
        if(t[i].poz==1) t[i].poz=++nr;
    for(int i=0;i<=n;i++)
        sol[0][i]=t[convert(s[i])].poz;
}
bool sortare (bla q,bla w)
{
    if(q.first!=w.first) return q.first<w.first;
    return q.second<w.second;
}
void construct_suffix_array ()
{
       for(int i=1;i<=m;i++)
       { int y=i-1; y=1<<y;
           for(int j=0;j<=n;j++)
               {t[j].first=sol[i-1][j],t[j].second=sol[i-1][y+j],t[j].poz=j; if(+j>n) t[j].second=-1;}
           sort(t,t+n+1,sortare);
           int nr=0;
           sol[i][t[0].poz]=0;
           for(int j=1;j<=n;j++)
               if(t[j].first==t[j-1].first && t[j].second==t[j-1].second) sol[i][t[j].poz]=nr;
                  else sol[i][t[j].poz]=++nr;
       }
}
int lcp (int i,int j)
{
    if(i==j) return n-i+1;
    int rez=0;
    for(int k=m;k>=0;k--)
        if(sol[k][i]==sol[k][j] && i<=n && j<=n)
            i=i+1<<k,j=j+1<<k,rez=rez+1<<k;
        return rez;
}
void solve_here ()
{
    for(int i=0;i<=n;i++)
        t[sol[m][i]].poz=i;
    for(int i=0;i<=n-k+1;++i)
    {
        int c=lcp(t[i].poz,t[i+k-1].poz);
        if(c>maxim) maxim=c;
    }
}
void write ()
{
    cout<<maxim;
}
int main()
{
    read();
    init();
    construct_suffix_array();
    solve_here();
    write();
    cin.close();
    cout.close();
    return 0;
}