Pagini recente » Cod sursa (job #2899161) | Cod sursa (job #1238552) | Cod sursa (job #794941) | Cod sursa (job #1527433) | Cod sursa (job #1232236)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[17005];
struct vec
{ int v1,v2,pos; } a[17005];
bool comp(vec x,vec y)
{ if (x.v1==y.v1) return x.v2<y.v2;
return x.v1<y.v1;
}
int n,k,lg,dp[17][17005],p[17005];
int lcp(int x,int y)
{ int i,res=0,aux;
if (x>y) swap(x,y); aux=y;
for(i=lg;i>=0;i--)
{
if (dp[i][x]==dp[i][y])
{ x+=1<<i; y+=1<<i; res+=1<<i;}
if (y>n) return n-aux+1;
}
return res;
}
int main()
{ int i,j,ord,sol=0;
f>>n>>k;
f>>s+1;
for(i=1;i<=n;i++)
{
a[i].v1=(int)s[i];
a[i].v2=0;
a[i].pos=i;
}
lg=((int) log2((double)n))+1;
for(i=0;i<=lg;i++)
{
if (i)
for(j=1;j<=n;j++)
{ a[j].v1=dp[i-1][j];
if (j+(1<<(i-1))>n) a[j].v2=-1;
else a[j].v2=dp[i-1][j+(1<<(i-1))];
a[j].pos=j;
}
sort(a+1,a+n+1,comp);
ord=0; dp[i][a[1].pos]=0;
for(j=2;j<=n;j++)
{
if (a[j].v1>a[j-1].v1 || (a[j].v1==a[j-1].v1 && a[j].v2>a[j-1].v2)) ord++;
dp[i][a[j].pos]=ord;
}
}
for(i=1;i<=n;i++)
p[dp[lg][i]]=i;
for(i=0;i<n-k+1;i++)
sol=max(sol,lcp(p[i],p[i+k-1]));
g<<sol;
return 0;
}