Cod sursa(job #1470244)

Utilizator robertstrecheStreche Robert robertstreche Data 10 august 2015 16:34:45
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.31 kb
#include <fstream>
#include <algorithm>

#define NMAX 16384
#define LOGMAX 15

using namespace std;

ifstream f("substr.in");
ofstream g("substr.out");

int n,k,p,el,boss;
int ind[NMAX],LCP[NMAX];
int best[LOGMAX][NMAX],RMQ[LOGMAX][NMAX];

string S;

struct elem{
   int poz;
   int nr[2];
}X[NMAX];

inline bool comp(elem e1,elem e2){
    return (e1.nr[0]!=e2.nr[0]?e1.nr[0]<e2.nr[0]:e1.nr[1]<e2.nr[1]);
}
inline int prefix(int i,int j){
    int pref=0,ii=ind[i],jj=ind[j];
    for (int pp=p-1;pp>=0;pp--)
     if (jj+(1<<pp)<n && best[pp][ii]==best[pp][jj])ii+=1<<pp,jj+=1<<pp,pref+=1<<pp;
    return pref;
}
int main(){
    f>>n>>k;
    if (k==1){
        g<<n;
        return 0;
    }
    f>>S;

    for (int i=0;i<n;i++)
      best[0][i]=S[i]-'a';

    for (p=1;(1<<p)<n;p++,el=0){
      for (int i=0;i<n;i++){
          X[i].poz=i;
          X[i].nr[0]=best[p-1][i];
          X[i].nr[1]=(i+(1<<(p-1))<n?best[p-1][i+(1<<(p-1))]:-1);
      }

      sort(X,X+n,comp);

      for (int i=0;i<n;i++){
          if (1<<(p+1)>=n)ind[i]=X[i].poz;
          best[p][X[i].poz]=(X[i-1].nr[0]==X[i].nr[0] && X[i-1].nr[1]==X[i].nr[1]?el:++el);
      }
    }
    for (int i=0;i+k-1<n;i++){
          int val=prefix(i,i+k-1);
          boss=(val>boss?val:boss);
      }
   g<<boss;
}