Submission #444031

#TimeUsernameProblemLanguageResultExecution timeMemory
444031Killer2501Palindromes (APIO14_palindrome)C++14
100 / 100
80 ms71244 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
using namespace std;
using ll = int;
using pll = pair<ll, ll>;
const int N = 3e5+5;
const int mod = 1e9+7;
int n, m, k, now, suff;
long long ans;
string s;
struct node
{
    ll num, len, slink, nxt[26];
    vector<ll> e;
}tree[N];
void init()
{
    now = suff = 2;
    tree[1].len = -1;
    tree[1].slink = 1;
    tree[1].e.pb(2);
    tree[2].len = 0;
    tree[2].slink = 1;

}
void add(int pos)
{
    int c = s[pos] - 'a';
    int cur = suff, curlen = 0;
    while(true)
    {
        curlen = tree[cur].len;
        if(pos-curlen-1 >= 0 && s[pos-curlen-1] == s[pos])break;
        cur = tree[cur].slink;
    }
    if(tree[cur].nxt[c])
    {
        suff = tree[cur].nxt[c];
        ++tree[suff].num;
        return;
    }
    ++now;
    suff = now;
    tree[now].len = tree[cur].len + 2;
    tree[now].num = 1;
    tree[cur].nxt[c] = now;
    if(tree[now].len == 1)
    {
        tree[2].e.pb(now);
        tree[now].slink = 2;
        return;
    }
    while(true)
    {
        cur = tree[cur].slink;
        curlen = tree[cur].len;
        if(pos-curlen-1 >= 0 && s[pos-curlen-1] == s[pos])break;
    }
    tree[now].slink = tree[cur].nxt[c];
    tree[tree[now].slink].e.pb(now);
}
void dfs(ll u)
{
    for(ll v : tree[u].e)
    {
        dfs(v);
        tree[u].num += tree[v].num;
    }
    ans = max(ans, 1ll*tree[u].num * tree[u].len);
}
void sol()
{
    cin >> s;
    init();
    for(int i = 0; i < s.length(); i ++)add(i);
    dfs(1);
    cout << ans;
}
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(0);
    sol();
}

Compilation message (stderr)

palindrome.cpp: In function 'void sol()':
palindrome.cpp:77:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |     for(int i = 0; i < s.length(); i ++)add(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...