Submission #303506

#TimeUsernameProblemLanguageResultExecution timeMemory
303506mohamedsobhi777Palindromes (APIO14_palindrome)C++14
0 / 100
57 ms27320 KiB
#include<bits/stdc++.h>

#pragma GCC optimize("-Ofast")
#pragma GCC optimize("trapv")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-funroll-loops")

#define pii pair<int,int> 
#define pll Pair<ll,ll>
#define I inline void
#define S struct
#define vi vector<int> 
#define vii vector<pii>


using namespace std ; 
using ll = long long ; 
using ld = long double ; 

const int N = 1e5 + 7 ; 

// How interesting!

int n ; 
int num , suf ; 

string s; 

struct node{
        int nxt[26] ; 
        int num, len, sufLink ; 
        int lazy ; 
} eet[N]; 

bool addL(int pos ){

        int let = s[pos] - 'a' ; 
        int cur = suf, curl = 0 ; 

        while(1){
                curl = eet[cur].len ; 
                if( pos - 1 - curl >= 0 && s[pos -1 - curl] == s[pos]){
                        break ; 
                }

                cur = eet[cur].sufLink ; 
        }

        if(eet[cur].nxt[let]){
                suf = eet[cur].nxt[let] ; 
                return false ;
        }

        suf = ++ num ;
        eet[num].len = eet[cur].len + 2 ; 
        eet[cur].nxt[let] = num ;
        eet[num].lazy = 1;  

        if(eet[num].len == 1){
                eet[num].sufLink = 2 ;
                eet[num].num = 1; 
                return 1 ; 
        }

        while(1){
                cur = eet[cur].sufLink ; 
                curl = eet[cur].len ;
                if( pos - 1 - curl >= 0 && s[pos -1 - curl] == s[pos]){
                        eet[num].sufLink = eet[cur].nxt[let] ;
                        break ; 
                }
        }


        eet[num].num = 1 + eet[eet[num].sufLink].num ; 

        return 1 ; 
}

I init(){
        suf = num = 2 ; 
        eet[1].len = - 1, eet[2].len = 0 ;
        eet[1].sufLink = eet[2].sufLink = 1; 
}

int viz[N]; 

int main(){
        ios_base::sync_with_stdio(0) ; 
        cin.tie(0) ; 
        //freopen("in.in" , "r" ,stdin) ; 
        cin >> s; 
        n = (int) s.size() ;
        init() ; 
        for(int i = 0 ;i < n; i++){
                addL(i) ;
        }

        ll ans = 0 ; 

        priority_queue<int> q ; 
        for(int i = 3 ; i <= num ; ++ i)
                q.push(i) ; 

        while(q.size()){
                int x = q.top(); q.pop() ; 
                if(viz[x]++)
                        continue ; 
                ans = max(ans , 1ll * eet[x].len * eet[x].lazy ) ;
                if(eet[x].sufLink > 2){
                        eet[ eet[x].sufLink ].lazy += eet[x].lazy ; 
                        q.push(eet[x].sufLink) ;
                }
        }

        cout<< ans; 
        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...