답안 #877222

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
877222 2023-11-23T04:00:24 Z noiaint Rima (COCI17_rima) C++17
140 / 140
236 ms 137592 KB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

#define file ""

#define mp make_pair
#define fi first
#define se second
#define all(x) x.begin(), x.end()

#define bit(x) (1LL << (x))
#define getbit(x, i) (((x) >> (i)) & 1)
#define popcount __builtin_popcountll

mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count());
int rand(int l, int r) {
    return l + rd() % (r - l + 1);
}

const int N = 1e6 + 5;
const int mod = (int)1e9 + 7; // 998244353;
const int lg = 25; // lg + 1
const int oo = 1e9;
const long long ooo = 1e18;

template<class X, class Y> bool mini(X &a, Y b) {
    return a > b ? (a = b, true) : false;
}
template<class X, class Y> bool maxi(X &a, Y b) {
    return a < b ? (a = b, true) : false;
}
void add(int &a, int b) {
    a += b;
    if (a >= mod) a -= mod;
    if (a < 0) a += mod;
}

int n;
int res = 0;

struct node {
    node *child[26];
    bool leaf;
    int f;
    node() {
        for (int i = 0; i < 26; ++i) child[i] = nullptr;
        leaf = false;
        f = 0;
    }
} *root = new node();

void addword(string s) {
    node *p = root;
    for (char i : s) {
        int c = i - 'a';
        if (!p->child[c]) p->child[c] = new node();
        p = p->child[c];
    }
    p->leaf = true;
}

void dfs(node *u) {
    int first = 0, second = 0;
    int childleaf = 0;
    for (int c = 0; c < 26; ++c) if (u->child[c]) {
        dfs(u->child[c]);
        if (u->child[c]->leaf) {
            ++childleaf;
            if (u->child[c]->f > first) second = first, first = u->child[c]->f;
            else maxi(second, u->child[c]->f);
        }
    }
    u->f = childleaf + first;
    maxi(res, u->f);
    maxi(res, u->f + second + u->leaf);
}

void process() {
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        string s;
        cin >> s;
        reverse(all(s));
        addword(s);
    }

    dfs(root);

    cout << res;
}

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

    // freopen(file".inp", "r", stdin);
    // freopen(file".out", "w", stdout);

    int tc = 1;
    // cin >> tc;
    
    while (tc--) {
        process();
    }

    return 0;
}

/*

*/
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 236 ms 137592 KB Output is correct
5 Correct 13 ms 3860 KB Output is correct
6 Correct 62 ms 86168 KB Output is correct
7 Correct 58 ms 85992 KB Output is correct
8 Correct 56 ms 85536 KB Output is correct
9 Correct 74 ms 91232 KB Output is correct
10 Correct 58 ms 85760 KB Output is correct