제출 #44656

#제출 시각아이디문제언어결과실행 시간메모리
44656yusufake회문 (APIO14_palindrome)C++98
100 / 100
40 ms40308 KiB
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <utility>
#include <cstring>
#include <cassert>
#include <cmath>
#include <stack>
#include <queue>
 
using namespace std;
 
const int MAXN = 505000;
 
struct node {
    int next[26];
    int len;
    int sufflink;
    int num;
};
 
int len;
char s[MAXN];
node tree[MAXN]; 
int num;            // node 1 - root with len -1, node 2 - root with len 0
int suff;           // max suffix palindrome
long long x,ans;
 
bool addLetter(int pos) {
    int cur = suff, curlen = 0;
    int let = s[pos] - 'a';
 
    while (true) {
        curlen = tree[cur].len;
        if (s[pos - 1 - curlen] == s[pos])     
            break;  
        cur = tree[cur].sufflink;
    }       
    if (tree[cur].next[let]) {  
        suff = tree[cur].next[let];
        tree[suff].num++;
        return false;
    }
 
    num++;
    suff = num;
    tree[num].len = tree[cur].len + 2;
    tree[cur].next[let] = num;
    tree[num].num = 1;
        
    if (tree[num].len == 1) {
        tree[num].sufflink = 2;
        return true;
    }
 
    while (true) {
        cur = tree[cur].sufflink;
        curlen = tree[cur].len;
        if (s[pos - 1 - curlen] == s[pos]) {
            tree[num].sufflink = tree[cur].next[let];
            break;
        }       
    }           
 
    return true;
}
 
void initTree() {
    num = 2; suff = 2;
    tree[1].len = -1; tree[1].sufflink = 1;
    tree[2].len = 0; tree[2].sufflink = 1;
}
 
int main() {
    //assert(freopen("input.txt", "r", stdin));
    //assert(freopen("output.txt", "w", stdout));
 
    scanf(" %s", s);
    len = strlen(s);
 
    initTree();
 
    for (int i = 0; i < len; i++) {
        addLetter(i);
    }
 
    for(int i=num; i ;i--){
        tree[ tree[i].sufflink ].num += x = tree[i].num;
        ans = max(ans , x*tree[i].len);
    }
    
    cout << ans << endl;
 
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

palindrome.cpp: In function 'int main()':
palindrome.cpp:83:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf(" %s", s);
     ~~~~~^~~~~~~~~~
#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...