답안 #47588

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
47588 2018-05-05T07:21:28 Z TAMREF 회문 (APIO14_palindrome) C++11
100 / 100
360 ms 68732 KB
#include <bits/stdc++.h>
//#define TAMREF 1
using namespace std;

typedef long long ll;

const char g = 'a' + 26;
const ll o[2] = {613LL, 409LL};
const ll h = 1e9 + 613;
const int mx = 6e5 + 5;

char S[mx], P[mx];
int n, m;

void input(){
    scanf("%s",P); m = strlen(P);
    for(int i = 0; i < m; i++){
        S[2*i] = g;
        S[2*i+1] = P[i];
    }
    S[2*m] = g;
    n = 2 * m + 1;
}

int R[mx];

void Manacher(){
    int r = 0, j = 0;
    for(int i = 1; i < n; i++){
        int &h = R[i];
        if(i <= r) h = min(r - i, R[2*j - i]);
        while(i-h-1 >= 0 && i+h+1 < n && S[i-h-1] == S[i+h+1]) ++h;
        if(i + h > r){
            j = i;
            r = i + h;
        }
    }
}

ll ph[2][mx], hs[2][mx];

void init_hash(){
    for(int i = 0; i < n; i++) S[i] -= 'a'-1;

    for(int b = 0; b < 2; b++){
        ph[b][0] = 1;
        hs[b][0] = S[0];
        for(int i = 1; i < n; i++){
            ph[b][i] = ph[b][i-1] * o[b] % h;
            hs[b][i] = (hs[b][i-1] * o[b] + S[i]) % h;
        }
    }
}

inline ll enc(int s, int e){
    ll H[2];
    for(int b = 0; b < 2; b++){
        H[b] = ((hs[b][e] - hs[b][s-1] * ph[b][e-s+1]) % h + h) % h;
    }
    return H[0] * h + H[1];
}

unordered_map<ll,int> I;
vector<int> cnt(1);
vector<int> len(1);
vector<vector<int>> gph(1);
vector<int> isRoot(1);

void Shrink(){
    for(int i = 1, s, e; i < n-1; i++){
        if(!R[i]) continue;
        s = i - R[i] + 1, e = i + R[i] - 1;

        ll tmp;
        int child_i = -1;
        int tmp_i;
        int flag_once = 1, keep_loop = 1;

        while(e >= s){
            tmp = enc(s,e);
            tmp_i = I[tmp];
            if(!tmp_i){ //insert new hash value
                #ifdef TAMREF
                printf("%d-th HASH : [%d, %d],\nhash string = ",cnt.size(),s,e);
                for(int j = s; j <= e; j++) printf("%c",S[j] + 'a' - 1);
                puts("");
                #endif // TAMREF
                tmp_i = I[tmp] = cnt.size();
                cnt.push_back(flag_once);
                len.push_back((e-s)/2 + 1);
                gph.push_back(vector<int>());
                isRoot.push_back(1);
            }else{
                #ifdef TAMREF
                printf("[%d, %d] is already found\n",s,e);
                #endif // TAMREF
                cnt[tmp_i] += flag_once;
                keep_loop = 0;
            }

            flag_once = 0;

            if(child_i != -1){
                gph[tmp_i].push_back(child_i);
                isRoot[child_i] = 0;
            }

            if(!keep_loop || e - 2 < s + 2) break;

            child_i = tmp_i;

            e -= 2;
            s += 2;
        }
    }
}

int vis[mx];
ll ans = 1;

int dfs(int x){
    #ifdef TAMREF
    printf("dfs : %d\n",x);
    #endif // TAMREF
    ll c = cnt[x];
    vis[x] = 1;
    for(int &u : gph[x]){
        if(!vis[u]) c += dfs(u);
    }
    ans = max(ans, c * len[x]);
    return c;
}

void pro(){
    int N = cnt.size();
    for(int i = 1; i < N; i++){
        #ifdef TAMREF
        printf("%d - th node : cnt = %d, len = %d, isRoot = %d, |gph| = %d\n",i,cnt[i],len[i],isRoot[i],gph[i].size());
        #endif // TAMREF
        if(isRoot[i] && !vis[i]){
            #ifdef TAMREF
            printf("dfs start on %d\n",i);
            #endif // TAMREF
            dfs(i);
        }
    }
    printf("%lld\n",ans);
}

int main(){
    input();
    Manacher();
    init_hash();
    Shrink();
    pro();
}

Compilation message

palindrome.cpp: In function 'void input()':
palindrome.cpp:16:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%s",P); m = strlen(P);
     ~~~~~^~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 560 KB Output is correct
4 Correct 2 ms 560 KB Output is correct
5 Correct 2 ms 560 KB Output is correct
6 Correct 2 ms 560 KB Output is correct
7 Correct 2 ms 560 KB Output is correct
8 Correct 2 ms 560 KB Output is correct
9 Correct 2 ms 560 KB Output is correct
10 Correct 2 ms 596 KB Output is correct
11 Correct 2 ms 596 KB Output is correct
12 Correct 2 ms 616 KB Output is correct
13 Correct 2 ms 620 KB Output is correct
14 Correct 2 ms 620 KB Output is correct
15 Correct 2 ms 620 KB Output is correct
16 Correct 2 ms 656 KB Output is correct
17 Correct 2 ms 656 KB Output is correct
18 Correct 2 ms 656 KB Output is correct
19 Correct 2 ms 656 KB Output is correct
20 Correct 2 ms 656 KB Output is correct
21 Correct 2 ms 656 KB Output is correct
22 Correct 2 ms 656 KB Output is correct
23 Correct 2 ms 656 KB Output is correct
24 Correct 2 ms 656 KB Output is correct
25 Correct 2 ms 656 KB Output is correct
26 Correct 2 ms 656 KB Output is correct
27 Correct 2 ms 656 KB Output is correct
28 Correct 2 ms 656 KB Output is correct
29 Correct 2 ms 656 KB Output is correct
30 Correct 2 ms 656 KB Output is correct
31 Correct 2 ms 656 KB Output is correct
32 Correct 2 ms 656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 764 KB Output is correct
2 Correct 2 ms 764 KB Output is correct
3 Correct 2 ms 764 KB Output is correct
4 Correct 2 ms 764 KB Output is correct
5 Correct 2 ms 764 KB Output is correct
6 Correct 2 ms 764 KB Output is correct
7 Correct 3 ms 764 KB Output is correct
8 Correct 2 ms 764 KB Output is correct
9 Correct 2 ms 764 KB Output is correct
10 Correct 2 ms 764 KB Output is correct
11 Correct 2 ms 764 KB Output is correct
12 Correct 2 ms 764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 2744 KB Output is correct
2 Correct 8 ms 2752 KB Output is correct
3 Correct 9 ms 2916 KB Output is correct
4 Correct 8 ms 2916 KB Output is correct
5 Correct 7 ms 2916 KB Output is correct
6 Correct 7 ms 2916 KB Output is correct
7 Correct 8 ms 2916 KB Output is correct
8 Correct 3 ms 2916 KB Output is correct
9 Correct 3 ms 2916 KB Output is correct
10 Correct 6 ms 2916 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 21652 KB Output is correct
2 Correct 72 ms 21652 KB Output is correct
3 Correct 91 ms 21948 KB Output is correct
4 Correct 76 ms 21948 KB Output is correct
5 Correct 71 ms 21948 KB Output is correct
6 Correct 51 ms 21948 KB Output is correct
7 Correct 71 ms 21948 KB Output is correct
8 Correct 16 ms 21948 KB Output is correct
9 Correct 29 ms 21948 KB Output is correct
10 Correct 64 ms 21948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 314 ms 65700 KB Output is correct
2 Correct 300 ms 65700 KB Output is correct
3 Correct 360 ms 66236 KB Output is correct
4 Correct 315 ms 66236 KB Output is correct
5 Correct 264 ms 66236 KB Output is correct
6 Correct 267 ms 66236 KB Output is correct
7 Correct 251 ms 66236 KB Output is correct
8 Correct 46 ms 66236 KB Output is correct
9 Correct 44 ms 66236 KB Output is correct
10 Correct 241 ms 66236 KB Output is correct
11 Correct 317 ms 68732 KB Output is correct
12 Correct 60 ms 68732 KB Output is correct