Submission #392759

#TimeUsernameProblemLanguageResultExecution timeMemory
392759danielcm585Palindromes (APIO14_palindrome)C++14
100 / 100
82 ms73588 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second

typedef long long ll;
typedef pair<int,int> ii;

const int N = 3e5;
ll suff, num, ans;
string s;

struct node {
    int nx[26];
    ll link, len, cnt;
    vector<int> adj;
    
} tree[N+2];

void insert(int p) {
    int curSuff = suff, curLen = 0, x = s[p]-'a';
    while (1) {
        curLen = tree[curSuff].len;
        if (p-1-curLen >= 0 && s[p-1-curLen] == s[p]) break;
        curSuff = tree[curSuff].link;
    }
    if (tree[curSuff].nx[x]) {
        suff = tree[curSuff].nx[x];
        tree[suff].cnt++;
        return;
    }
    suff = ++num;
    tree[num].len = tree[curSuff].len+2;
    tree[num].cnt = 1;
    tree[curSuff].nx[x] = num;
    if (tree[num].len == 1) {
        tree[num].link = 2;
        tree[2].adj.push_back(num);
        return;
    }
    while (1) {
        curSuff = tree[curSuff].link;
        curLen = tree[curSuff].len;
        if (p-1-curLen >= 0 && s[p-1-curLen] == s[p]) {
            tree[num].link = tree[curSuff].nx[x];
            tree[tree[curSuff].nx[x]].adj.push_back(num);
            break;
        }
    }
}

void dfs(int cur) {
    for (int nx : tree[cur].adj) {
        dfs(nx);
        tree[cur].cnt += tree[nx].cnt;
    }
    ans = max(ans,tree[cur].len*tree[cur].cnt);
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> s;
    num = suff = 2;
    tree[1].len = -1, tree[1].link = 1;
    tree[2].len = 0, tree[2].link = 1;
    tree[1].adj.push_back(2);
    for (int i = 0; i < s.length(); i++) insert(i);
    dfs(1);
    cout << ans << '\n';
    return 0;
}

Compilation message (stderr)

palindrome.cpp: In function 'int main()':
palindrome.cpp:68:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     for (int i = 0; i < s.length(); i++) insert(i);
      |                     ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...