Cod sursa(job #2035530)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 9 octombrie 2017 16:33:48
Problema Substr Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <algorithm>
#define lim (1<<14)+2
#define log 14
#define ascii 256
using namespace std;
int arr[log][lim],ord[ascii];
char sir[lim];
struct elem{int st,dr,ind;};
elem suff[lim];
bool cmp(elem a,elem b){
    if(a.st<b.st)
        return true;
    if(a.st>b.st)
        return false;
    if(a.dr<=b.dr)
        return true;
    else
        return false;
}
int lcp(int poz1,int poz2,int n){
    int i,pas,rasp=0;
    for(i=log;i>=0;i--){
        pas=1<<i;
        if(poz1+pas-1<=n&&poz2+pas-1<=n&&arr[i][poz1]==arr[i][poz2]){
            poz1+=pas;
            poz2+=pas;
            rasp+=pas;
        }
    }
    return rasp;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("substr.in","r");
    fout=fopen("substr.out","w");
    int i,j,k,n,cate=0,rasp=0,pref;
    char ch;
    fscanf(fin,"%d%d",&n,&k);
    ch=fgetc(fin);
    for(i=1;i<=n;i++){
        sir[i]=fgetc(fin);
        ord[sir[i]]=1;
    }
    for(i=0;i<ascii;i++){
        if(ord[i]==1)
            cate++;
        ord[i]=cate;
    }
//suffix array
    for(j=1;j<=n;j++)
        arr[0][j]=ord[sir[j]];
    for(i=1;(1<<i)<=n;i++){//sufixe cu lungime 2^i
        for(j=1;j<=n;j++){
            suff[j].st=arr[i-1][j];
            if(j+(1<<(i-1))>n)
                suff[j].dr=0;
            else
                suff[j].dr=arr[i-1][j+(1<<(i-1))];
            suff[j].ind=j;
        }
        sort(suff+1,suff+n+1,cmp);
        cate=0;
        for(j=1;j<=n;j++){
            if(suff[j-1].st!=suff[j].st||suff[j-1].dr!=suff[j].dr)
                cate++;
            arr[i][suff[j].ind]=cate;
        }
    }
//lcp
    for(i=1;i<n;i++){
        pref=lcp(suff[i].ind,suff[i+k-1].ind,n);
        if(pref>rasp)
            rasp=pref;
    }
    fprintf(fout,"%d",rasp);
    fclose(fin);
    fclose(fout);
    return 0;
}