Cod sursa(job #1054156)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 13 decembrie 2013 13:55:49
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.39 kb
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;
typedef struct { int s1,s2,poz; } tip;
tip aux[17000];
int i,n,m,p[17000][16],d,loog,l,rez,j,ind[17000];
string s;

bool cmp( const tip &a, const tip &b) {
      if (a.s1!=b.s1) return(a.s1<b.s1); else return(a.s2<b.s2);
}

int prefix(int x, int y) {
    int sol=0;
    if (x==y) return(n-x+1);
    for (int i=loog; i>=0 && x<=n && y<=n; --i) 
        if (p[x][i]==p[y][i]) { sol+=(1<<i); x+=(1<<i); y+=(1<<i); }
    return(sol);
}

int main(void){
    ifstream fin("substr.in");
    ofstream fout("substr.out");
    
    fin>>n>>d; getline(fin,s); getline(fin,s);
    for (i=1; i<=n; ++i) p[i][0]=s[i-1]-'a';
    int n1=n;
    while (n1>0) { ++loog; n1/=2; } 
    
    for (i=1, l=1; i<=loog && l<=n; ++i, l*=2) {
        
        for (j=1; j<=n; ++j) {
            aux[j].s1=p[j][i-1];
            if (j+l<=n) aux[j].s2=p[j+l][i-1]; else aux[j].s2=-1;
            aux[j].poz=j;
            }
            
        sort(aux+1,aux+n+1,cmp);
     
       for (j=1; j<=n; ++j) 
        if (aux[j].s1==aux[j-1].s1&&aux[j].s2==aux[j-1].s2) p[aux[j].poz][i]=p[aux[j-1].poz][i];
          else p[aux[j].poz][i]=j;
          
          }
          
     for (i=1; i<=n; ++i) ind[p[i][loog]]=i; 
    
     for (i=1; i<=n-d; ++i) rez=max(rez,prefix(ind[i],ind[i+d-1]));
     
    fout<<rez;
  return(0);
}