110252024-06-17 11:49:20mraron2016. januárcpp17Elfogadva 702ms1016 KiB
#include<bits/stdc++.h>
using namespace std;

struct node {
    int child[3];
    int par, par_c;
    int go[3]={-1,-1,-1};
    int link=-1;
    
    bool ends;
    int sum_on_links=-1;
};

node aho[10100];
int nxt=1;

void add(string& s) {
    int curr=0;
    for(char c:s) {
        if(!aho[curr].child[c-'0']) {
            aho[curr].child[c-'0']=nxt++;
            aho[aho[curr].child[c-'0']].par=curr;
            aho[aho[curr].child[c-'0']].par_c=c-'0';
        }
        curr=aho[curr].child[c-'0'];
    }
    aho[curr].ends=true;
}

int go(int x, int c);
int get_link(int x) {
    if(aho[x].link!=-1) return aho[x].link;
    if(!x || !aho[x].par) return aho[x].link=0;
    return aho[x].link=go(get_link(aho[x].par), aho[x].par_c);
}
int go(int x, int c) {
    if(aho[x].go[c]!=-1) return aho[x].go[c];
    if(aho[x].child[c]>0) return aho[x].go[c]=aho[x].child[c];
    if(x==0) return aho[x].go[c]=0;
    if(get_link(x)!=x) {
        return aho[x].go[c]=go(get_link(x), c);
    }
    return aho[x].go[c]=0;
}

int sum(int x) {
    if(x==0) return 0;
    if(aho[x].sum_on_links!=-1) return aho[x].sum_on_links;
    return aho[x].sum_on_links=(int)aho[x].ends+sum(get_link(x));
}



int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n,k;
    cin>>n>>k;
    assert(k<=5000);
    int sum_len=0;
    for(int i=0;i<n;++i) {
        string s;
        cin>>s;
        add(s);
        assert((sum_len+=s.size())<=10000);
    }
    for(int i=0;i<nxt;++i) {
        sum(i);
    }
    vector<int> dp(nxt,-1e9);
    dp[0]=0;
    for(int i=0;i<k;++i) {
        vector<int> ndp(nxt, -1e9);
        for(int j=0;j<nxt;++j) {
            for(int c=0;c<3;++c) {
                int st=go(j, c);
                ndp[st]=max(ndp[st], aho[st].sum_on_links+dp[j]);
            }
        }
        ndp.swap(dp);
    }
    cout<<*max_element(dp.begin(), dp.end())<<"\n";
}
1 - Elfogadva
Memória: 868KiB
Idő: 3ms

Program kimenete:
99
Elvárt kimenet:
99
Ellenőrző kimenete:

2 - Elfogadva
Memória: 868KiB
Idő: 3ms

Program kimenete:
1999
Elvárt kimenet:
1999
Ellenőrző kimenete:

3 - Elfogadva
Memória: 868KiB
Idő: 4ms

Program kimenete:
11249
Elvárt kimenet:
11249
Ellenőrző kimenete:

4 - Elfogadva
Memória: 868KiB
Idő: 3ms

Program kimenete:
322
Elvárt kimenet:
322
Ellenőrző kimenete:

5 - Elfogadva
Memória: 868KiB
Idő: 3ms

Program kimenete:
491
Elvárt kimenet:
491
Ellenőrző kimenete:

6 - Elfogadva
Memória: 872KiB
Idő: 85ms

Program kimenete:
31308
Elvárt kimenet:
31308
Ellenőrző kimenete:

7 - Elfogadva
Memória: 868KiB
Idő: 296ms

Program kimenete:
19994
Elvárt kimenet:
19994
Ellenőrző kimenete:

8 - Elfogadva
Memória: 772KiB
Idő: 405ms

Program kimenete:
12999
Elvárt kimenet:
12999
Ellenőrző kimenete:

9 - Elfogadva
Memória: 776KiB
Idő: 391ms

Program kimenete:
14996
Elvárt kimenet:
14996
Ellenőrző kimenete:

10 - Elfogadva
Memória: 868KiB
Idő: 388ms

Program kimenete:
71
Elvárt kimenet:
71
Ellenőrző kimenete:

11 - Elfogadva
Memória: 868KiB
Idő: 391ms

Program kimenete:
54
Elvárt kimenet:
54
Ellenőrző kimenete:

12 - Elfogadva
Memória: 868KiB
Idő: 3ms

Program kimenete:
221
Elvárt kimenet:
221
Ellenőrző kimenete:

13 - Elfogadva
Memória: 888KiB
Idő: 14ms

Program kimenete:
690270
Elvárt kimenet:
690270
Ellenőrző kimenete:

14 - Elfogadva
Memória: 1016KiB
Idő: 231ms

Program kimenete:
390910
Elvárt kimenet:
390910
Ellenőrző kimenete:

15 - Elfogadva
Memória: 868KiB
Idő: 37ms

Program kimenete:
675595
Elvárt kimenet:
675595
Ellenőrző kimenete:

16 - Elfogadva
Memória: 868KiB
Idő: 314ms

Program kimenete:
267074
Elvárt kimenet:
267074
Ellenőrző kimenete:

17 - Elfogadva
Memória: 936KiB
Idő: 584ms

Program kimenete:
64749
Elvárt kimenet:
64749
Ellenőrző kimenete:

18 - Elfogadva
Memória: 868KiB
Idő: 702ms

Program kimenete:
14997
Elvárt kimenet:
14997
Ellenőrző kimenete: