Submission #260635

#TimeUsernameProblemLanguageResultExecution timeMemory
260635shayan_pPalindromes (APIO14_palindrome)C++17
100 / 100
87 ms65536 KiB
// And you curse yourself for things you never done

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

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

const int maxn = 3e5 + 10, mod = 1e9 + 7, inf = 1e9 + 10;

int f[maxn], ln[maxn];
int nxt[maxn][26];
vector<int> v[maxn];

int val[maxn];

ll ANS;
int dfs(int u){
    int num = val[u];
    for(int y : v[u]){
	num+= dfs(y);
    }
    ANS = max(ANS, 1ll * num * ln[u]);
    return num;
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie();

    int C = 2;
    ln[0] = -1;
    ln[1] = 0;
    f[1] = 0;
    f[0] = 0;
    
    string s;
    cin >> s;
    int tmp = 1;
    for(int i = 0; i < sz(s); i++){
	while(i - ln[tmp] <= 0 || s[i - ln[tmp] - 1] != s[i])
	    tmp = f[tmp];
	if(nxt[tmp][s[i] - 'a'] == 0){
	    ln[C] = ln[tmp] + 2;
	    nxt[tmp][s[i] - 'a'] = C;

	    int tmp2 = f[tmp];
	    while(i - ln[tmp2] <= 0 || s[i - ln[tmp2] - 1] != s[i])
		tmp2 = f[tmp2];
	    if(tmp == 0)
		f[C] = 1;
	    else
		f[C] = nxt[tmp2][s[i] - 'a'];
	    C++;
	}	
	tmp = nxt[tmp][s[i] - 'a'];
	val[tmp]++;
    }
    for(int i = 1; i < C; i++){
	v[f[i]].PB(i);
    }    
    dfs(0);
    return cout << ANS << endl, 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...