Cod sursa(job #1739571)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 9 august 2016 19:07:49
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

struct nod{
	int len, nr_ap;
	nod *suffix;
	map<char, nod*> next; };

void add_ch(nod* rad, nod*& last, const char ch, vector<vector<nod*>>& layers){
	nod *cur = new nod { last->len + 1, 1, nullptr, map<char, nod*> {} },
		*p = last;
	layers[cur->len].push_back(cur);

	for( ; p && !p->next.count(ch); p = p->suffix){
		p->next[ch] = cur; }
	if(!p){
		cur->suffix = rad; }
	else{
		nod *q = p->next[ch];
		if(q->len == p->len+1){
			cur->suffix = q; }
		else{
			nod *clone = new nod { p->len + 1, 0, q->suffix, q->next };
			layers[clone->len].push_back(clone);
			cur->suffix = q->suffix = clone;
			for( ; p && p->next[ch] == q; p = p->suffix){
				p->next[ch] = clone; } } }
	last = cur; }

int main(){
	ifstream f("substr.in");
	ofstream g("substr.out");
	int n, k;
	f >> n >> k;

	string str(n, ' ');
	f >> str;

	nod *rad = new nod {0, 0, nullptr, map<char, nod*> {} }, *last = rad;

	vector<vector<nod*>> layers(n+1);

	for(const auto ch : str){
		add_ch(rad, last, ch, layers); }
	for(auto it = layers.rbegin(); it != layers.rend(); ++it){
		for(auto x : *it){
			x->suffix->nr_ap += x->nr_ap; } }
	layers[0].push_back(rad);

	for(int i = n; i >= 0; --i){
		if(any_of(begin(layers[i]), end(layers[i]), [k](nod* n){
					return n->nr_ap >= k; })){
			g << i << '\n';
			return 0; } } }