Cod sursa(job #1473164)

Utilizator DjokValeriu Motroi Djok Data 18 august 2015 18:41:21
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lol {
    int x,y,poz;
}troll;

int i,j,n,k,sfa[17][16505],lg,rs,l,poz[16505];
troll b[16505];
string s;

bool cmp(const troll &a,const troll &b) {
    if(a.x==b.x) return a.y<b.y;
    return a.x<b.x;
}

int Prefix(int x,int y) {
    if(x==y) return n-x+1;

    int aux=0,i;
    for(i=lg;i>=0 && x<=n && y<=n;--i)
    if(sfa[i][x]==sfa[i][y]) aux+=(1<<i),x+=(1<<i),y+=(1<<i);

    return aux;
}

int main()
{
  ifstream cin("substr.in");
  ofstream cout("substr.out");

  cin>>n>>k; getline(cin,s);
  getline(cin,s);

  for(int aux=n;aux;aux/=2) ++lg;
  for(i=1;i<=n;++i) sfa[0][i]=s[i-1]-'a';

  for(i=l=1;i<=lg && l<=n;++i,l<<=1)
  {
    for(j=1;j<=n;++j)
    {
      b[j].x=sfa[i-1][j];
      b[j].y=(j+l<=n ? sfa[i-1][j+l]:-1);
      b[j].poz=j;
    }

    sort(b+1,b+n+1,cmp);

    for(j=1;j<=n;++j)
    if(b[j].x==b[j-1].x && b[j].y==b[j-1].y) sfa[i][b[j].poz]=sfa[i][b[j-1].poz];
    else sfa[i][b[j].poz]=j;
  }

  for(i=1;i<=n;++i) poz[sfa[lg][i]]=i;

  for(i=1;i<=n-k;++i) rs=max(rs,Prefix(poz[i],poz[i+k-1]));

  cout<<rs<<'\n';

 return 0;
}