Pagini recente » Cod sursa (job #2694857) | Cod sursa (job #362480) | Cod sursa (job #542331) | Cod sursa (job #2238307) | Cod sursa (job #2035530)
#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;
}