Cod sursa(job #1758836)

Utilizator Bodo171Bogdan Pop Bodo171 Data 17 septembrie 2016 22:50:12
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include<fstream>
#include<algorithm>
#include<climits>
using namespace std;
int t,i,n,m,cnt,lev,level,a[17][16500],x,mx,val,k,ap[258],key,ke[258];
char s[67000];
struct suffix
{
    int unu,doi,poz;
}l[16500];
bool comp(suffix la,suffix lb)
{
    if(la.unu==lb.unu) return la.doi<lb.doi;
    return la.unu<lb.unu;
}
int lcp(int x,int y)
{
    t=min(n-x+1,n-y+1);
    val=0;lev=level;
    while(val<=t&&lev>=0)
    {
        if(a[lev][x]==a[lev][y])
            x+=(1<<lev),y+=(1<<lev),val+=(1<<lev);
        lev--;
    }
    return val;
}
int main()
{
    ifstream f("substr.in");
    ofstream g("substr.out");
    f>>n>>k;
    for(i=1;i<=n;i++)
     {f>>s[i];ap[s[i]]=1;}
     key=1;l[0].unu=-1;
     for(i=0;i<=CHAR_MAX;i++)
     {
         if(ap[i])
         {
             ke[i]=key;
             key++;
         }
     }
    for(i=1;i<=n;i++)
    {
        a[0][i]=ke[s[i]];
    }
   for(cnt=1;(1<<(cnt-1))<=n;cnt++)
    {
        for(i=1;i<=n;i++)
        {
            l[i].unu=a[cnt-1][i];
            l[i].doi=a[cnt-1][i+(1<<(cnt-1))];
            l[i].poz=i;
        }
        sort(l+1,l+n+1,comp);
        key=0;
        for(i=1;i<=n;i++)
        {
            if((l[i].unu!=l[i-1].unu)||(l[i].doi!=l[i-1].doi))
                key++;
            a[cnt][l[i].poz]=key;
        }
        level=cnt;
    }
    if(k==1) {g<<n;return 0;}
    for(i=1;i<=n-k+1;i++)
    {
        x=lcp(l[i].poz,l[i+k-1].poz);
        if(x>mx) mx=x;
    }
    g<<mx;
    return 0;
}