Submission #315359

# Submission time Handle Problem Language Result Execution time Memory
315359 2020-10-22T15:29:32 Z LifeHappen__ Palindromes (APIO14_palindrome) C++14
100 / 100
86 ms 69504 KB
#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;

struct Node {
    int nxt[26], sufflink;
    ll len, cnt;
    vector<int> edges;
} tree[303030];

string s;
int suff, num;
ll ans = 0;

void add_letter(int pos) {
    int curr = suff, curr_len = 0;
    int letter = s[pos] - 'a';

    while (true) {
        curr_len = tree[curr].len;
        if (pos - 1 - curr_len > -1 && s[pos - 1 - curr_len] == s[pos])
            break;
        curr = tree[curr].sufflink;
    }
    if (tree[curr].nxt[letter]) {
        suff = tree[curr].nxt[letter];
        tree[suff].cnt++;
        return;
    }

    suff = ++num;
    tree[num].len = tree[curr].len + 2;
    tree[num].cnt = 1;
    tree[curr].nxt[letter] = num;

    if (tree[num].len == 1) {
        tree[num].sufflink = 2;
        tree[2].edges.push_back(num);
        return;
    }

    while (true) {
        curr = tree[curr].sufflink;
        curr_len = tree[curr].len;
        if (pos - 1 - curr_len > -1 && s[pos - 1 - curr_len] == s[pos]) {
            tree[num].sufflink = tree[curr].nxt[letter];
            tree[tree[curr].nxt[letter]].edges.push_back(num);
            break;
        }
    }
}

void init() {
    num = 2, suff = 2;
    tree[1].len = -1, tree[1].sufflink = 1;
    tree[2].len = 0, tree[2].sufflink = 1;
    tree[1].edges.push_back(2);
}

void dfs(int node = 1) {
    for (int i : tree[node].edges) {
        dfs(i);
        tree[node].cnt += tree[i].cnt;
    }
    ans = max(ans, tree[node].len * tree[node].cnt);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> s;
    init();
    FOR(i, 0, s.size()) add_letter(i);
    dfs();
    cout << ans;
    return 0;
}

Compilation message

palindrome.cpp: In function 'int main()':
palindrome.cpp:2:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    2 | #define FOR(i, x, y) for (int i = x; i < y; i++)
......
   74 |     FOR(i, 0, s.size()) add_letter(i);
      |         ~~~~~~~~~~~~~~                  
palindrome.cpp:74:5: note: in expansion of macro 'FOR'
   74 |     FOR(i, 0, s.size()) add_letter(i);
      |     ^~~
# Verdict Execution time Memory Grader output
1 Correct 27 ms 45440 KB Output is correct
2 Correct 26 ms 45440 KB Output is correct
3 Correct 27 ms 45440 KB Output is correct
4 Correct 28 ms 45344 KB Output is correct
5 Correct 26 ms 45432 KB Output is correct
6 Correct 27 ms 45448 KB Output is correct
7 Correct 26 ms 45440 KB Output is correct
8 Correct 26 ms 45440 KB Output is correct
9 Correct 26 ms 45440 KB Output is correct
10 Correct 26 ms 45440 KB Output is correct
11 Correct 26 ms 45440 KB Output is correct
12 Correct 27 ms 45440 KB Output is correct
13 Correct 26 ms 45440 KB Output is correct
14 Correct 26 ms 45440 KB Output is correct
15 Correct 26 ms 45560 KB Output is correct
16 Correct 26 ms 45440 KB Output is correct
17 Correct 27 ms 45440 KB Output is correct
18 Correct 26 ms 45440 KB Output is correct
19 Correct 27 ms 45440 KB Output is correct
20 Correct 26 ms 45436 KB Output is correct
21 Correct 27 ms 45440 KB Output is correct
22 Correct 26 ms 45440 KB Output is correct
23 Correct 26 ms 45432 KB Output is correct
24 Correct 29 ms 45440 KB Output is correct
25 Correct 27 ms 45440 KB Output is correct
26 Correct 27 ms 45440 KB Output is correct
27 Correct 27 ms 45432 KB Output is correct
28 Correct 26 ms 45440 KB Output is correct
29 Correct 26 ms 45440 KB Output is correct
30 Correct 26 ms 45440 KB Output is correct
31 Correct 26 ms 45440 KB Output is correct
32 Correct 26 ms 45340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 45440 KB Output is correct
2 Correct 27 ms 45440 KB Output is correct
3 Correct 27 ms 45440 KB Output is correct
4 Correct 27 ms 45368 KB Output is correct
5 Correct 27 ms 45432 KB Output is correct
6 Correct 27 ms 45432 KB Output is correct
7 Correct 26 ms 45432 KB Output is correct
8 Correct 26 ms 45440 KB Output is correct
9 Correct 27 ms 45440 KB Output is correct
10 Correct 28 ms 45440 KB Output is correct
11 Correct 26 ms 45440 KB Output is correct
12 Correct 27 ms 45440 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 45944 KB Output is correct
2 Correct 26 ms 45948 KB Output is correct
3 Correct 27 ms 46200 KB Output is correct
4 Correct 29 ms 46072 KB Output is correct
5 Correct 27 ms 45560 KB Output is correct
6 Correct 27 ms 45648 KB Output is correct
7 Correct 27 ms 45824 KB Output is correct
8 Correct 26 ms 45412 KB Output is correct
9 Correct 27 ms 45432 KB Output is correct
10 Correct 27 ms 45440 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 39 ms 51072 KB Output is correct
2 Correct 39 ms 50048 KB Output is correct
3 Correct 41 ms 53504 KB Output is correct
4 Correct 40 ms 51756 KB Output is correct
5 Correct 43 ms 46816 KB Output is correct
6 Correct 36 ms 47480 KB Output is correct
7 Correct 38 ms 48640 KB Output is correct
8 Correct 29 ms 45752 KB Output is correct
9 Correct 31 ms 47360 KB Output is correct
10 Correct 40 ms 46712 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 67 ms 62464 KB Output is correct
2 Correct 63 ms 57340 KB Output is correct
3 Correct 68 ms 69504 KB Output is correct
4 Correct 62 ms 60544 KB Output is correct
5 Correct 86 ms 50432 KB Output is correct
6 Correct 62 ms 56192 KB Output is correct
7 Correct 60 ms 54556 KB Output is correct
8 Correct 34 ms 46336 KB Output is correct
9 Correct 33 ms 46344 KB Output is correct
10 Correct 74 ms 49536 KB Output is correct
11 Correct 62 ms 57728 KB Output is correct
12 Correct 36 ms 48128 KB Output is correct