Cod sursa(job #1048915)

Utilizator ion824Ion Ureche ion824 Data 6 decembrie 2013 17:16:59
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN = 17003;
const int MAXLG = 16;
struct entry {
    int nr[2], p;
} L[MAXN];
int P[MAXLG][MAXN], Q[MAXN], N, stp, K;
string s;

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

int lcp(int x,int y){
    int k, ans=0;
    if (x == y) return N - x;
    for(k=stp-1; k>=0 && x < N && y < N; --k)
      if(P[k][x] == P[k][y])
      {
        x+=1<<k; y+=1<<k; ans+=1<<k;           
      }   
    return ans;
}

int main(){
    ifstream f("substr.in");
    ofstream g("substr.out");
    int i,cnt,MaxPrefix;
    
    f>>N>>K; getline(f,s);
    getline(f,s);
    
    for(i=0;i<N;++i)
      P[0][i]=(s[i]-'0');
    for( stp=1, cnt=1; cnt >> 1 < N; ++stp, cnt<<=1)
    {
      for(i=0;i<N;++i)
      {
         L[i].nr[0] = P[stp-1][i];
         L[i].nr[1] = i + cnt < N ? P[stp-1][i+cnt] : -1 ;
         L[i].p = i;               
      }     
      sort(L, L+N, cmp);  
      for (i = 0; i < N; ++i)
            P[stp][L[i].p] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[stp][L[i - 1].p] : i; 
    }
    
    for(i=0;i<N;++i) Q[P[stp-1][i]]=i;
    MaxPrefix = 0;
    
    for(i=0;i<N-K+1;++i)
     MaxPrefix=max(MaxPrefix,lcp(Q[i],Q[i+K-1]));

    g<<MaxPrefix;

 return 0;   
}