Cod sursa(job #2343379)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 13 februarie 2019 22:26:24
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define dim 17000
#define v1 first.first
#define v2 first.second
#define poz second
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
pair < pair<int,int> , int >L[dim];
int p[20][dim],sol[dim];
int e,n,k,i,len;
char s[dim];
int lcp (int i,int j){
int f=e;
int putere=(1<<e);
int sol=0;
while(putere){
  if(p[f][i]==p[f][j]){
    sol+=putere;
    i+=putere;
    j+=putere;
  }
  f--;
  putere/=2;
}
return sol;
}
int main()
{
  fin>>n>>k>>s;
  if(k==1){
    fout<<n;
    return 0;
  }
  for(i=0;i<n;i++)
    p[0][i]=s[i]-'a';
  for(e=0,len=1;len<=n;e++,len*=2){
    for(i=0;i<n;i++){
        L[i].v1=p[e][i];
        if(i+len>=n)
            L[i].v2=-1;
            else
            L[i].v2=p[e][i+len];
        L[i].poz=i;
    }
    sort(L,L+n);
    p[e+1][L[0].poz]=0;
    for(i=1;i<n;i++){
        if(L[i].first==L[i-1].first)
            p[e+1][L[i].poz]=p[e+1][L[i-1].poz];
        else
            p[e+1][L[i].poz]=p[e+1][L[i-1].poz]+1;
    }
  }
  for(i=0;i<n;i++)
    sol[p[e][i]]=i;
  int soll=0;
  for(i=0;i+k-1<n;i++){
    soll=max(soll,lcp(sol[i],sol[i+k-1]));
  }
  fout<<soll;
}