Pagini recente » Cod sursa (job #923668) | Cod sursa (job #535821) | Cod sursa (job #1707512) | Istoria paginii runda/unu | Cod sursa (job #1739575)
#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; } } }