Cod sursa(job #1465025)

Utilizator andreey_047Andrei Maxim andreey_047 Data 26 iulie 2015 12:44:02
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF -99999
#define nmax 17000
using namespace std;
int N,dp[nmax][21];
char s[nmax];
struct Coord{
 int l,r,poz;
}V[nmax];

inline bool cmp(const Coord A , const Coord B){
 if(A.l == B.l && A.r == B.r)
    return false;
 if(A.l == B.l)
    return A.r < B.r;
 return A.l < B.l;
}
inline int LCP(int x,int y){
 int i,sol = 0,k,j;
 j = N - max(x,y);
 for(k = 0; (1<<k) <= j; ++k);
 --k;

 for(i = k; i >= 0 && x <= N && y <= N; --i){
        if(x + (1<<i)-1 > N || y+(1<<i)-1 > N) continue;
    if(dp[x][i] == dp[y][i])
     sol+=(1<<i),x+=(1<<i),y+=(1<<i);
 }

  return sol;
}
inline void dinamica(){
 int i,j;
  for(i = 1; i <= N; ++i)
    dp[i][0] = s[i] - 'a';

  for(j = 1; (1<<(j-1)) <= N; ++j){

    for(i = 1; i <= N; ++i){
        V[i].l = dp[i][j-1];

        if(i + (1<<(j-1)) > N)
            V[i].r = INF;

        else V[i].r = dp[i+(1<<(j-1))][j-1];

        V[i].poz = i;
    }
    sort(V+1,V+N+1,cmp);

    for(i = 1;  i <= N; ++i){
        dp[V[i].poz][j] = dp[V[i-1].poz][j]+1;
        if(V[i].l == V[i-1].l && V[i].r == V[i-1].r)
            --dp[V[i].poz][j];
    }

  }

}
int main(){
    int i,sol=0,k;
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d%d\n%s",&N,&k,s+1);

    dinamica();
    for(i = 1; i <= N-k + 1; ++i)
        sol = max(sol , LCP(V[i].poz , V[i+k-1].poz));

    printf("%d\n",sol);
    return 0;
}