Pagini recente » Cod sursa (job #3237285) | Cod sursa (job #2457155) | Cod sursa (job #1286663) | Cod sursa (job #1337199) | Cod sursa (job #543693)
Cod sursa(job #543693)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define nmax 16400
FILE *in,*out;
int a[17][nmax],c[nmax],coada[nmax],put,n;
pair<pair<int,int> ,int > b[nmax];
pair<int,int> d[nmax];
char s[nmax];
int lcp(int x,int y)
{
int rez=0,i;
for (i=put;i>=1;i--)
{
if (a[i][x]==a[i][y])
{
rez+=(1<<i);
x+=(1<<i);
y+=(1<<i);
if (y>n|| x> n)
return rez;
}
}
return rez;
}
int main()
{
int k,i,j,p,u,rez;
in=fopen("substr.in","r");
out=fopen("substr.out","w");
fscanf(in,"%d%d",&n,&k);
fscanf(in,"%s",s+1);
if (k==1)
{
fprintf(out,"%d\n",n);
fclose(in);
fclose(out);
return 0;
}
for (i=1;i<=n;i++)
a[0][i]=s[i];
for (i=1;(1<<(i-1))<=n;i++)
{
for (j=1;j<=n;j++)
{
b[j].fi.fi=a[i-1][j];
b[j].fi.se=(1<<(i-1))+j>n?-1:a[i-1][j+(1<<(i-1))];
b[j].se=j;
}
sort(b+1,b+n+1);
a[i][b[1].se]=1;
for (j=2;j<=n;j++)
if (b[j].fi==b[j-1].fi)
a[i][b[j].se]=a[i][b[j-1].se];
else
a[i][b[j].se]=a[i][b[j-1].se]+1;
}
put=i-1;
for (i=1;i<=n;i++)
d[i]=mp(a[put][i],i);
sort(d+1,d+n+1);
rez=-1;
for (i=k;i<=n;i++)
rez=max(rez,lcp(d[i-k+1].se,d[i].se));
/*for (i=2;i<=n;i++)
c[i]=lcp(d[i-1].se,d[i].se);*/
/*k--;
p=1;
u=0;
rez=-1;*/
/*for (i=2;i<=n;i++)
{
if (i-coada[p]==k)
rez=max(rez,c[coada[p]]);
while (p<=u && i-coada[p]>=k)
p++;
while (p<=u && c[coada[u]]>c[i])
u--;
u++;
coada[u]=i;
}*/
fprintf(out,"%d\n",rez);
fclose(in);
fclose(out);
return 0;
}