Cod sursa(job #1574997)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 21 ianuarie 2016 00:00:33
Problema Substr Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <cstring>
#include <algorithm>

#define DIM 16390

using namespace std;

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

char s[DIM];

int suf[20][DIM], lg, n, K;

struct data{

	int x;
	int y;
	int pos;

}codes[DIM];

pair<int, int> ord[DIM];

bool cmp(const data &a, const data &b) {

	return ((a.x != b.x) ? (a.x < b.x) : (a.y < b.y));

}

bool cmp2(const pair<int, int> &a, const pair <int, int> &b) {

	return a.first < b.first;

}

int lcp(int a, int b) {

	int res = 0;

	for (int k = lg; k >= 0 && a < n && b < n; k--) {

		if (suf[k][a] != suf[k][b])
			continue;

		a += (1 << k);
		b += (1 << k);
		res += (1 << k);

	}
	return res;

}

int main() {

	fin >> n >> K;

	fin.get();

	fin.get(s, DIM - 1);

	for (int i = 0; i < n; i++)
		suf[0][i] = s[i];

	for (int step = 1; (1 << (step - 1)) < n; step++) {

		lg = step;

		for (int i = 0; i < n; i++) {

			codes[i].x = suf[step - 1][i];
			codes[i].y = i + (1 << (step - 1)) < n ? suf[step - 1][i + (1 << (step - 1))] : -1;

			codes[i].pos = i;

		}

		sort(codes, codes + n, cmp);

		suf[step][codes[0].pos] = 0;

		for (int i = 1; i < n; i++) {

			if (codes[i - 1].x == codes[i].x && codes[i - 1].y == codes[i].y)
				suf[step][codes[i].pos] = suf[step][codes[i - 1].pos];
			else
				suf[step][codes[i].pos] = i;

		}

		for (int i = 0; i < n; i++)
			ord[i] = make_pair(suf[step][i], i);

	}

	sort(ord, ord + n, cmp2);

	int solution = 0;

	for (int i = 0; i + K - 1 < n; i++) {

		solution = max(solution, lcp(ord[i].second, ord[i + K - 1].second));

	}

	fout << solution << "\n";

	return 0;

}

//Miriam e tare!