Submission #34242

#TimeUsernameProblemLanguageResultExecution timeMemory
34242wan2000Palindromes (APIO14_palindrome)C++14
100 / 100
83 ms67056 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 3e5+111;

int n;
string s;
ll res;
vector<int> Adj[N];

struct node{
    int next[26];
    int sufflink;
    int len;
    int num;
    node(){
        memset(next,255,sizeof(next));
    }
} Tree[N];
int num, suff;

void init(){
    num = suff = 2;
    Tree[1].len = -1; Tree[1].sufflink = 1;
    Tree[2].len = 0; Tree[2].sufflink = 1;
}

void add(int p){
    int x = s[p]-'a';
    int cur = suff, curLen;
    while(1){
        curLen = Tree[cur].len;
        if(p-curLen-1>=0&&s[p-curLen-1]==s[p]) break;
        cur = Tree[cur].sufflink;
    }
    if(Tree[cur].next[x]!=-1){
        suff = Tree[cur].next[x];
        Tree[suff].num++;
        return;
    }
    suff = ++num;
    Tree[cur].next[x] = num;
    Tree[num].len = Tree[cur].len+2;
    Tree[num].num++;
    if(Tree[num].len==1){
        Tree[num].sufflink = 2;
        Adj[2].push_back(num);
        return;
    }
    while(1){
        cur = Tree[cur].sufflink;
        curLen = Tree[cur].len;
        if(p-curLen-1>=0&&s[p-curLen-1]==s[p]){
            Tree[num].sufflink = Tree[cur].next[x];
            Adj[Tree[cur].next[x]].push_back(num);
            return;
        }
    }
}

void DFS(int u){
    for(auto v: Adj[u]){
        DFS(v);
        Tree[u].num += Tree[v].num;
    }
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>s;
    n = s.size();
    init();
    for(int i = 0; i < n; i++){
        add(i);
    }
    DFS(2);
    for(int i = 3; i <= num; i++){
        res = max(res,(ll)Tree[i].num*Tree[i].len);
    }
    cout<<res<<'\n';
    return 0;
}
#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...