Pagini recente » Cod sursa (job #26670) | Cod sursa (job #947294) | Cod sursa (job #1174053) | Cod sursa (job #2580862) | Cod sursa (job #1174052)
#include<stdio.h>
#include<string.h>
#include<algorithm>
const int N=16400, L=17;
using namespace std;
FILE *f,*g;
int power[L];
int suff[L][N]; int step;
char s[N]; int n,k;
void makepower(void){
int i;
for(i=0;i<=L-1;i++) power[i]=1<<i;
}
struct entry{
int f,l,p;
bool operator < (const entry& b) const{
if (f != b.f) return (f < b.f);
else return (l < b.l);
}
} aux[N];
void makesuff(char *s){
int i; int cnt;
for(i=1;i<=n;i++) suff[0][i]=s[i]-'a';
for(step=1,cnt=1; cnt>>1 <= N; step++, cnt<<=1){
for(i=1;i<=n;i++){
aux[i].f=suff[step-1][i];
if (i+cnt <= n) aux[i].l=suff[step-1][i+cnt];
else aux[i].l=-1;
aux[i].p=i;
}
sort(aux+1,aux+n+1);
for(i=1;i<=n;i++)
if (aux[i].f == aux[i-1].f && aux[i].l == aux[i-1].l) suff[step][aux[i].p]=suff[step][aux[i-1].p];
else suff[step][aux[i].p]=i;
}
step--;
}
int lcp (int x, int y){
int k; int ret=0;
if (x == y) return n-x+1;
for(k=step ; k>=0 && x<=n && y<=n ; k--)
if (suff[k][x] == suff[k][y])
x+=power[k] , y+=power[k], ret+=power[k];
return ret;
}
void read(void){
f=fopen("substr.in","r");
g=fopen("substr.out","w");
fscanf(f,"%d%d%s",&n,&k,s);
int i;
for(i=n;i>=1;i--) s[i]=s[i-1];
}
int main(void){
read();
makepower();
makesuff(s);
int maxim=0;
int i; int l;
for(i=1;i<=n-k+1;i++)
maxim=max(maxim,lcp(aux[i].p,aux[i+k-1].p));
fprintf(g,"%d",maxim);
}