Pagini recente » Cod sursa (job #2776018) | Cod sursa (job #3284620) | Cod sursa (job #1027460) | Cod sursa (job #236146) | Cod sursa (job #2384880)
#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;
if(x == y)
return n;
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 << '\n';
g.close();
return 0;
}