Cod sursa(job #1232657)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 23 septembrie 2014 17:08:00
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fi("substr.in");
ofstream fo("substr.out");

struct element{
       int x,y;
       int p;
       
       bool operator<(const element &b)const{ return ((x==b.x)?(y<b.y):(x<b.x)); }
       bool operator==(const element &b)const{ return (x==b.x && y==b.y); }
       bool operator>(const element &b)const{ return ((x==b.x)?(y>b.y):(x>b.x)); }
};

const int max_len = 16504;
const int max_lg = 16;//(1<<15)=32768

int P[max_len][max_lg],v[max_len],pas,n,k;
char s[max_len];
element L[max_len];

void BuildSuffixArray(char *s, int n, int P[max_len][max_lg], int v[max_len]){
     int i;
     
     //pas=0, lung=1
     for(i=1;i<=n;i++)
       if(s[i]>='a' && s[i]<='z') P[i][0]=s[i]-'a'+1;
       else if(s[i]>='A' && s[i]<='Z') P[i][0]=s[i]-'A'+29;
       else if(s[i]>='0' && s[i]<='9') P[i][0]=s[i]-'0'+60;
     
     for(pas=1; (1<<pas)<=2*n; ++pas)
        {
         for(i=1;i<=n;i++)
            {
             L[i].x=P[i][pas-1];
             L[i].y=(i+(1<<(pas-1))<=n)?(P[i+(1<<(pas-1))][pas-1]):(-1);
             L[i].p=i;
            }    
            
         sort(L+1,L+n+1);
         
         for(i=1;i<=n;i++)
           P[L[i].p][pas]=(i>1 && L[i-1]==L[i])?(P[L[i-1].p][pas]):(i);
        }
        
     --pas;
     for(i=1;i<=n;i++) v[P[i][pas]]=i;
}

int LCP(int x, int y){
    int k,lung=0;;
    
    if(x==y) return (n-x+1);
    
    for(k=pas; k>=0 && x<=n && y<=n; --k)
      if(P[x][k]==P[y][k])
        {
         x+=(1<<k);
         y+=(1<<k);
         lung+=(1<<k);
        }
    
    return lung;
}

int main(){
    fi>>n>>k>>(s+1);
    
    BuildSuffixArray(s,n,P,v);

    int sol=0;
    for(int i=1;i+k-1<=n;i++)
      sol=max(sol,LCP(v[i],v[i+k-1]));
          
    fo<<sol;
    
    fi.close();
    fo.close();
    return 0;
}