Cod sursa(job #356301)

Utilizator tvladTataranu Vlad tvlad Data 14 octombrie 2009 12:24:11
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;

const int SZ = 16384;
const int logSZ = 16;

struct entry { int a,b,p; };
bool operator< ( const entry &x, const entry &y ) { return x.a == y.a ? x.b < y.b : x.a < y.a; }
bool operator== ( const entry &x, const entry &y) { return x.a == y.a && x.b == y.b; }

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

int n,k;
string s;
entry v[SZ];
int msz;
int mat[logSZ][SZ];
int lcp[SZ];

void suffix_array() {
	for (int i = 0; i < n; ++i) mat[0][i] = s[i];
	msz = 1;
	for (int cnt = 1; (cnt>>1) < n; ++msz, cnt <<= 1) {
		for (int i = 0; i < n; ++i) {
			v[i].a = mat[msz-1][i];
			v[i].b = i + cnt < n ? mat[msz-1][i+cnt] : -1;
			v[i].p = i;
		}
		sort(v,v+n);
		for (int i = 0; i < n; ++i) {
			mat[msz][v[i].p] = i > 0 && v[i] == v[i-1] ? mat[msz][v[i-1].p] : i;
		}
	}
	--msz;
}

int LCP ( int x, int y ) {
	if (x == y) return n-x;
	int rez = 0;
	for (int k = msz; k >= 0 && x < n && y < n; --k)
		if (mat[k][x] == mat[k][y])
			x += 1<<k, y += 1<<k, rez += 1<<k;
	return rez;
}

int max_min_seq ( int k ) {
	deque<int> Q;
	int max = 0;
	for (int i = 0; i < n; ++i) {
		if (!Q.empty() && i >= k && Q.front() == lcp[i-k]) Q.pop_front();
		while (!Q.empty() && Q.back() > lcp[i]) Q.pop_back();
		Q.push_back(lcp[i]);
		if (i >= k-1 && Q.front() > max)
			max = Q.front();
	}
	return max;
}

int main() {
	fin >> n >> k;
	if (k == 1) {
		fout << n << '\n';
		return 0;
	}
	fin >> s;
	suffix_array();
	for (int i = 0; i < n-1; ++i) lcp[i] = LCP(v[i].p, v[i+1].p);
	fout << max_min_seq(k-1) << '\n';
	return 0;
}