Pagini recente » Cod sursa (job #2587449) | Cod sursa (job #2977174) | Cod sursa (job #1469604) | Cod sursa (job #1503342) | Cod sursa (job #916487)
Cod sursa(job #916487)
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
#define NMAX 16385
#define LMAX 16
struct entry {
int nr[2],poz;
};
struct cmp {
bool operator () (const entry &a, const entry &b) {
if(a.nr[0]==b.nr[0])
return a.nr[1]<b.nr[1];
return a.nr[0]<b.nr[0];
}
};
entry l[NMAX];
int p[LMAX][NMAX],v[NMAX],n,k,lg;
char s[NMAX+1];
void suffix_array()
{
int i,cnt;
for(i=1;i<=n;i++)
p[0][i]=s[i]-47;
for(cnt=1;(1<<(cnt-1))<=n;cnt++) {
for(i=1;i<=n;i++) {
l[i].poz=i;
l[i].nr[0]=p[cnt-1][i];
if(i+(1<<(cnt-1))<=n)
l[i].nr[1]=p[cnt-1][i+(1<<(cnt-1))];
else l[i].nr[1]=-1;
}
sort(l+1,l+n+1,cmp());
p[cnt][l[1].poz]=1;
for(i=2;i<=n;i++) {
p[cnt][l[i].poz]=p[cnt][l[i-1].poz];
if(l[i].nr[0]!=l[i-1].nr[0] || l[i].nr[1]!=l[i-1].nr[1])
p[cnt][l[i].poz]++;
}
}
lg=cnt-1;
for(i=1;i<=n;i++)
v[p[lg][i]]=i;
}
int LCP(int x, int y)
{
int i,sol;
sol=0;
for(i=lg;i>=0;i--)
if(p[i][x]==p[i][y]) {
sol=sol+(1<<i);
x=x+(1<<i);
y=y+(1<<i);
if(x>n || y>n)
break;
}
return sol;
}
int main ()
{
int i,sol;
ifstream f("substr.in");
ofstream g("substr.out");
f>>n>>k;
f>>(s+1);
f.close();
suffix_array();
sol=0;
for(i=1;i<=n-k+1;i++)
sol=max(sol,LCP(v[i],v[i+k-1]));
g<<sol;
g.close();
return 0;
}