Cod sursa(job #2384880)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 21 martie 2019 11:47:22
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#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;
}