Cod sursa(job #218649)

Utilizator socheoSorodoc Ionut socheo Data 2 noiembrie 2008 21:06:23
Problema Substr Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

struct sit{
int nr[2],b;
}l[17000];

int i,j,mxa,n,v,p[25][17000],k,o;
char x[17000];
using namespace std;

bool cmp(const sit &a,const sit &b)
{
return (a.nr[0]==b.nr[0])?(a.nr[1]<b.nr[1]):(a.nr[0]<b.nr[0]);
}

int lcp(int f,int g)
{ int q,w=0;
 if(f==g) return n-f;
 for(q=k-1;q>0&&f<n&&g<n;--q)
  if(p[q][f]==p[q][g])
    { f+=1<<q; g+=1<<q; w+=1<<q;}
  return w;
}

int main()
{  freopen("substr.in","r",stdin);
   freopen("substr.out","w",stdout);
 scanf("%d%d",&n,&v);
 scanf("%s",&x);
for(i=0;i<n;i++)
 p[0][i]=x[i]-'a';
for(k=1,j=1;j/2<n;j=j*2,++k)
 {
  for(i=0;i<n;++i)
   {
     l[i].nr[0]=p[k-1][i];
     if(i+j<n)
      l[i].nr[1]=p[k-1][i+j];
     else l[i].nr[1]=-1;
    l[i].b=i;
   }
   sort(l,l+n,cmp);
  for(i=0;i<n;++i)
   if(l[i].nr[0]==l[i-1].nr[0]&&l[i].nr[1]==l[i-1].nr[1])
     p[k][l[i].b]=p[k][l[i-1].b];
   else p[k][l[i].b]=i;
  }
 for(i=0;i<=n-v;i++)
  {  o=lcp(l[i].b,l[i+v-1].b);
  if(o>mxa)
   mxa=o;
   }
 printf("%d",mxa);
  
return 0;
}