Pagini recente » Cod sursa (job #2226800) | Cod sursa (job #1785049) | Cod sursa (job #2395775) | Cod sursa (job #351103) | Cod sursa (job #57424)
Cod sursa(job #57424)
#include <cstdio>
#define NMAX 16384
#define LOGMAX 16
struct entry {short int poz,label[2];};
int N,K;
char sir[NMAX+2];
short int P[LOGMAX][NMAX],level;
entry E[NMAX],F[NMAX];
short int count[NMAX],poz[NMAX];
short int ordine[NMAX];
void rsort(entry (&E)[NMAX], entry (&F)[NMAX], int k, bool special)
{
int i;
if(special)
for(i=0;i<=N || i<128;i++)
count[i]=0;
else
for(i=0;i<=N;i++)
count[i]=0;
for(i=0;i<N;i++)
count[E[i].label[k]]++;
poz[0]=0;
if(special)
for(i=1;i<=N || i<128;i++)
poz[i]=poz[i-1]+count[i-1];
else
for(i=1;i<=N;i++)
poz[i]=poz[i-1]+count[i-1];
for(i=0;i<N;i++)
F[poz[E[i].label[k]]++]=E[i];
}
void radixsort(bool special)
{
rsort(E,F,1,special);
rsort(F,E,0,special);
}
#include <algorithm>
using namespace std;
inline int cmp(entry A, entry B)
{
return A.label[0]==B.label[0] ? A.label[1]<B.label[1] : A.label[0]<B.label[0];
}
void suffix_array()
{
int i,j,pas;
for(j=0;j<N;j++)
P[0][j]=sir[j]-'0'+1;
for(i=1,pas=1;pas<N;++i,pas<<=1)
{
for(j=0;j<N;j++)
{
E[j].poz=j;
E[j].label[0]=P[i-1][j];
if(j+pas>=N)
E[j].label[1]=0;
else
E[j].label[1]=P[i-1][j+pas];
}
// radixsort(i==1);
sort(E,E+N,cmp);
int cnt=0;
P[i][E[0].poz]=0;
for(j=1;j<N;j++)
{
if(E[j].label[0]!=E[j-1].label[0] || E[j].label[1]!=E[j-1].label[1])
cnt++;
P[i][E[j].poz]=cnt;
}
}
level=i-1;
}
int lcp(int a, int b)
{
int i,lung=0;
if(a==b)
return N-a;
for(i=level-1;i>=0 && a<N && b<N;--i)
if(P[i][a]==P[i][b])
{
lung+=(1<<i);
a+=(1<<i);
b+=(1<<i);
}
return lung;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
int i,max=0;
scanf("%d %d\n%s",&N,&K,&sir);
suffix_array();
for(i=0;i<N;i++)
ordine[P[level][i]]=i;
for(i=0;i<=N-K;i++)
{
int asem=lcp(ordine[i],ordine[i+K-1]);
if(max<asem)
max=asem;
}
printf("%d\n",max);
return 0;
}