Pagini recente » Cod sursa (job #2634329) | Cod sursa (job #2114240) | Cod sursa (job #1568526) | Cod sursa (job #2425084) | Cod sursa (job #2518980)
#include <stdio.h>
#include <algorithm>
#define NMAX 16500
using namespace std;
FILE *fin = fopen("substr.in", "r");
FILE *fout = fopen("substr.out", "w");
struct perechi {int nr0,nr1,poz;} p[NMAX];
int n,k,i,pwr,prec[16][NMAX],j,contor,inv[NMAX],ans,K;
char sir[NMAX];
bool cmp(perechi x, perechi y)
{
if(x.nr0 == y.nr0 and x.nr1 == y.nr1)
return x.poz < y.poz;
if(x.nr0 == y.nr0)
return x.nr1 < y.nr1;
return x.nr0 < y.nr0;
}
int prefix(int p1, int p2)
{
int ans = 0,i;
for(i=k; i>=0 and p1<=n-1 and p2<=n-1; --i)
if(prec[i][p1] == prec[i][p2])
{
ans += (1<<i);
p1 += (1<<i);
p2 += (1<<i);
}
return ans;
}
int main()
{
fscanf(fin, "%d%d\n", &n,&K);
fgets(sir, n+2, fin);
for(i=0; i<=n-1; ++i)
prec[0][i] = sir[i]-'a';
for(k=1,pwr=2; pwr/2 < n; ++k,pwr*=2)
{
for(i=0; i<=n-1; ++i)
{
p[i].nr0 = prec[k-1][i];
if(i+pwr/2 <= n-1)
p[i].nr1 = prec[k-1][i+pwr/2];
else
p[i].nr1 = -1;
p[i].poz = i;
}
sort(p, p+n, cmp);
contor = 0;
i = 0;
while(i <= n-1)
{
prec[k][p[i].poz] = contor;
j = i+1;
while(j<=n-1 and p[i].nr0 == p[j].nr0 and p[i].nr1 == p[j].nr1)
{
prec[k][p[j].poz] = contor;
++j;
}
contor++;
i = j;
}
}
--k;
// for(i=0; i<=n-1; ++i)
// fprintf(fout, "%d ", prec[k][i]);
for(i=0; i<=n-1; ++i)
inv[prec[k][i]] = i;
for(i=0; i <= n-K; ++i)
ans = max(ans, prefix(inv[i],inv[i+K-1]));
fprintf(fout, "%d", ans);
fclose(fin);
fclose(fout);
return 0;
}