Submission #84496

# Submission time Handle Problem Language Result Execution time Memory
84496 2018-11-15T17:28:03 Z popovicirobert Palindromes (APIO14_palindrome) C++14
23 / 100
400 ms 48828 KB
#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long
// 217
// 44

using namespace std;

const int MAXN = (int) 3e5;
const int B = 53;

char str[MAXN + 1];

ull pw[MAXN + 1], hsh[MAXN + 1];

inline ull get_hsh(int l, int r) {
    return hsh[r] - hsh[l - 1] * pw[r - l + 1];
}

int len[2 * MAXN + 5];

inline void manacher(int n) {
    vector <char> aux(2 * n + 5);
    int i, sz = 0;
    for(i = 1; i <= n; i++) {
        aux[++sz] = '*';
        aux[++sz] = str[i];
    }
    aux[++sz] = '*';
    int p = 0;
    for(i = 1; i <= sz; i++) {
        if(p + len[p] >= i) {
            len[i] = min(len[2 * p - i], p + len[p] - i);
        }
        while(i - len[i] > 0 && i + len[i] <= sz && aux[i - len[i]] == aux[i + len[i]]) {
            len[i]++;
        }
        if(i + len[i] > p + len[p]) {
            p = i;
        }
    }
}

unordered_map <ull, int> mp;

struct Trie {
    vector <int> sons;
    int lvl, sz;
};

vector <Trie> v;
ll ans = 0;

void dfs(int nod) {
    for(auto it : v[nod].sons) {
        dfs(it);
        v[nod].sz += v[it].sz;
    }
    ans = max(ans, 1LL * v[nod].lvl * v[nod].sz);
}

int main() {
    //ifstream cin("B.in");
    //ofstream cout("B.out");
    int i;
    ios::sync_with_stdio(false);
    cin >> str + 1;
    int n = strlen(str + 1);
    manacher(n);
    pw[0] = 1;
    for(i = 1; i <= n; i++) {
        pw[i] = pw[i - 1] * B;
        hsh[i] = hsh[i - 1] * B + str[i] - 'a' + 1;
    }
    int id = 1;
    v.resize(2);
    for(i = 2; i <= 2 * n; i++) {
        int last = 0, j = 0;
        bool ok = 0;
        for(j = len[i] / 2; j >= 1; j--) {
            ull cur = get_hsh(i / 2 - j + 1, i / 2 + j - (1 - i % 2));
            int l = 2 * j - (1 - i % 2);
            ok = 0;
            if(mp[cur] == 0) {
                ok = 1;
                mp[cur] = ++id;
                Trie aux;
                aux.lvl = l;
                aux.sz = 0;
                v.push_back(aux);
            }
            if(last != 0) {
                v[mp[cur]].sons.push_back(last);
            }
            else {
                v[mp[cur]].sz++;
            }
            last = mp[cur];
            if(!ok) {
                break;
            }
        }
        if(ok == 1) {
            v[1].sons.push_back(last);
        }
    }
    dfs(1);
    cout << ans;
    //cin.close();
    //cout.close();
    return 0;
}

Compilation message

palindrome.cpp: In function 'int main()':
palindrome.cpp:68:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     cin >> str + 1;
            ~~~~^~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 448 KB Output is correct
4 Correct 2 ms 500 KB Output is correct
5 Correct 2 ms 504 KB Output is correct
6 Correct 2 ms 508 KB Output is correct
7 Correct 2 ms 528 KB Output is correct
8 Correct 2 ms 576 KB Output is correct
9 Correct 2 ms 708 KB Output is correct
10 Correct 2 ms 708 KB Output is correct
11 Correct 2 ms 708 KB Output is correct
12 Correct 2 ms 708 KB Output is correct
13 Correct 2 ms 708 KB Output is correct
14 Correct 2 ms 708 KB Output is correct
15 Correct 2 ms 708 KB Output is correct
16 Correct 2 ms 708 KB Output is correct
17 Correct 2 ms 708 KB Output is correct
18 Correct 2 ms 708 KB Output is correct
19 Correct 2 ms 708 KB Output is correct
20 Correct 2 ms 708 KB Output is correct
21 Correct 2 ms 844 KB Output is correct
22 Correct 2 ms 844 KB Output is correct
23 Correct 2 ms 844 KB Output is correct
24 Correct 2 ms 844 KB Output is correct
25 Correct 2 ms 844 KB Output is correct
26 Correct 2 ms 844 KB Output is correct
27 Correct 2 ms 844 KB Output is correct
28 Correct 2 ms 844 KB Output is correct
29 Correct 2 ms 844 KB Output is correct
30 Correct 2 ms 844 KB Output is correct
31 Correct 2 ms 844 KB Output is correct
32 Correct 2 ms 844 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 892 KB Output is correct
2 Correct 3 ms 896 KB Output is correct
3 Correct 3 ms 896 KB Output is correct
4 Correct 2 ms 904 KB Output is correct
5 Correct 2 ms 908 KB Output is correct
6 Correct 2 ms 916 KB Output is correct
7 Correct 2 ms 916 KB Output is correct
8 Correct 2 ms 920 KB Output is correct
9 Correct 2 ms 924 KB Output is correct
10 Correct 2 ms 924 KB Output is correct
11 Correct 2 ms 924 KB Output is correct
12 Correct 2 ms 936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 2340 KB Output is correct
2 Correct 8 ms 2340 KB Output is correct
3 Correct 8 ms 2364 KB Output is correct
4 Correct 8 ms 2376 KB Output is correct
5 Correct 7 ms 2388 KB Output is correct
6 Correct 7 ms 2388 KB Output is correct
7 Correct 7 ms 2388 KB Output is correct
8 Correct 3 ms 2388 KB Output is correct
9 Correct 3 ms 2388 KB Output is correct
10 Incorrect 4 ms 2388 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 64 ms 16064 KB Output is correct
2 Correct 61 ms 16064 KB Output is correct
3 Correct 91 ms 16284 KB Output is correct
4 Correct 73 ms 16284 KB Output is correct
5 Correct 72 ms 16284 KB Output is correct
6 Correct 49 ms 16284 KB Output is correct
7 Correct 58 ms 16284 KB Output is correct
8 Correct 14 ms 16284 KB Output is correct
9 Correct 29 ms 16284 KB Output is correct
10 Incorrect 32 ms 16284 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 326 ms 48280 KB Output is correct
2 Correct 309 ms 48280 KB Output is correct
3 Correct 400 ms 48828 KB Output is correct
4 Correct 335 ms 48828 KB Output is correct
5 Correct 298 ms 48828 KB Output is correct
6 Correct 309 ms 48828 KB Output is correct
7 Correct 258 ms 48828 KB Output is correct
8 Correct 42 ms 48828 KB Output is correct
9 Correct 43 ms 48828 KB Output is correct
10 Incorrect 118 ms 48828 KB Output isn't correct
11 Halted 0 ms 0 KB -