Cod sursa(job #1608715)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 22 februarie 2016 12:06:13
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define NMAX 16400
using namespace std;
int n,k;
char ch[2*NMAX];
int suffix[NMAX][15],vec[NMAX],l2[NMAX];
struct str
{
    int left;
    int right;
    int p;
}v[NMAX];
int comp(str a,str b)
{
    if(a.left!=b.left) return a.left<b.left;
    return a.right<b.right;
}
int comp2(int a,int b)
{
    return suffix[a][l2[n]]<suffix[b][l2[n]];
}
int prefix(int p1,int p2)
{
    int m=min(l2[p1],l2[p2]);
    int rasp=0;
    for(;m>=0;m--)
    {
        if(suffix[p1+rasp][m]==suffix[p2+rasp][m])
        {
            rasp+=(1<<m);
        }
    }
    return rasp;
}
int main()
{
    freopen ("substr.in","r",stdin);
    freopen ("substr.out","w",stdout);
    for(int i=2;i<NMAX;i++)
    {
        l2[i]=l2[i-1];
        if((i&(i-1))==0) ++l2[i];
    }
    scanf("%d%d%c",&n,&k,&ch[0]);
    scanf("%s",ch);
    int maxim=0;
    for(int i=0;i<n;i++) suffix[i][0]=(int)ch[i];
    for(int j=1;j<=l2[n];j++)
    {
        for(int i=0;i<n;i++)
        {
            v[i].left=suffix[i][j-1];
            if(i+(1<<(j-1))>=n) v[i].right=-1;
            else v[i].right=suffix[i+(1<<(j-1))][j-1];
            v[i].p=i;
        }
        sort(v,v+n,comp);
        int ct=1;
        suffix[v[0].p][j]=ct;
        for(int i=1;i<n;i++)
        {
            if(v[i].left!=v[i-1].left||v[i].right!=v[i-1].right) ++ct;
            suffix[v[i].p][j]=ct;
        }
    }
    /* for(int j=0;j<=l2[n];j++)
    {
        for(int i=0;i<n;i++) printf("%d ",suffix[i][j]);
        printf("\n");
    }*/
    for(int i=0;i<n;i++) vec[i]=i;
    sort(vec,vec+n,comp2);
    for(int i=0;i+k-1<n;i++)
    {
        int pr=prefix(vec[i],vec[i+k-1]);
     //   for(int j=vec[i];j<n;j++) printf("%c",ch[j]);
    //    printf("\n");
  //      for(int j=vec[i+k-1];j<n;j++) printf("%c",ch[j]);
 //       printf("\n%d\n",pr);
        if(maxim<pr) maxim=pr;
    }
    printf("%d\n",maxim);
}