Cod sursa(job #1733732)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 25 iulie 2016 15:40:43
Problema Substr Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#define LOCAL
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define Nmax 16384
#define logN 15

struct suff
{
	int p;
	pii nr;
	bool operator <(const suff &s) const { return nr < s.nr; }
	bool operator ==(const suff &s) const { return nr == s.nr; }
};

int p[logN][Nmax], order[Nmax], line;
suff L[Nmax];

void suffixArrays(const string&);
int lcp(int, int, int);

int main()
{
	ifstream fin("substr.in");
	ofstream fout("substr.out");

	int i, n, k, pmax;
	string s;

	(fin >> n >> k).ignore();
	fin >> s;

	suffixArrays(s);

	for (pmax = 0, i = 0; i + k <= n; ++i) pmax = max(pmax, lcp(order[i], order[i + k - 1], n));

	fout << pmax << '\n';

    return 0;
}

void suffixArrays(const string &s)
{
	int i, diff, step;

	for (i = 0; i < s.length(); ++i) p[0][i] = static_cast<int>(s[i]);

	for (step = 1, diff = 1; diff < s.length(); diff <<= 1, ++step)
	{
		for (i = 0; i < s.length(); ++i)
		{
			L[i].nr.first = p[step - 1][i];
			L[i].nr.second = (i + diff < s.length() ? p[step - 1][i + diff] : -1);
			L[i].p = i;
		}

		sort(L, L + s.length());

		for (i = 0; i < s.length(); ++i)
			p[step][L[i].p] = (i > 0 && L[i] == L[i - 1] ? p[step][L[i - 1].p] : i);
	}

	line = step - 1;
	for (i = 0; i < s.length(); ++i) order[i] = L[i].p;
}

int lcp(int s1, int s2, int n)
{
	int res, step;

	for (res = 0, step = line; step; --step)
		if (p[step][s1] == p[step][s2])
			res += 1 << step,
			s1 += 1 << step,
			s2 += 1 << step;

	return res;
}