Cod sursa(job #1232236)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 22 septembrie 2014 15:50:23
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
 char s[17005];

 struct vec
 { int v1,v2,pos; } a[17005];

 bool comp(vec x,vec y)
 { if (x.v1==y.v1) return x.v2<y.v2;
    return x.v1<y.v1;
 }

 int n,k,lg,dp[17][17005],p[17005];

 int lcp(int x,int y)
 { int i,res=0,aux;
    if (x>y) swap(x,y); aux=y;

     for(i=lg;i>=0;i--)
     {
         if (dp[i][x]==dp[i][y])
         { x+=1<<i; y+=1<<i; res+=1<<i;}
       if (y>n) return n-aux+1;
     }

  return res;
 }
int main()
{ int i,j,ord,sol=0;
    f>>n>>k;
    f>>s+1;

   for(i=1;i<=n;i++)
   {
      a[i].v1=(int)s[i];
      a[i].v2=0;
      a[i].pos=i;
   }

   lg=((int) log2((double)n))+1;

   for(i=0;i<=lg;i++)
   {
       if (i)
        for(j=1;j<=n;j++)
         { a[j].v1=dp[i-1][j];
           if (j+(1<<(i-1))>n) a[j].v2=-1;
            else a[j].v2=dp[i-1][j+(1<<(i-1))];
           a[j].pos=j;
         }

       sort(a+1,a+n+1,comp);
         ord=0; dp[i][a[1].pos]=0;

        for(j=2;j<=n;j++)
        {
           if (a[j].v1>a[j-1].v1 || (a[j].v1==a[j-1].v1 && a[j].v2>a[j-1].v2)) ord++;
           dp[i][a[j].pos]=ord;
        }
   }


    for(i=1;i<=n;i++)
     p[dp[lg][i]]=i;

    for(i=0;i<n-k+1;i++)
     sol=max(sol,lcp(p[i],p[i+k-1]));


     g<<sol;
    return 0;
}