Submission #46180

# Submission time Handle Problem Language Result Execution time Memory
46180 2018-04-17T12:20:09 Z Extazy Palindromes (APIO14_palindrome) C++17
23 / 100
953 ms 71448 KB
#include <bits/stdc++.h>
#define endl '\n'
 
using namespace std;
 
const unsigned long long B1 = 31, B2 = 37;//, MOD = (1e9) + 7;
const int N = 300007;
 
struct rolling_hash {
    unsigned long long h1,h2;
     
    rolling_hash(): h1(0), h2(0) {}
 
    void append(char a) {
        h1*=B1;
        h1+=(a-'a'+1)^29;
        h2*=B2;
        h2+=(a-'a'+1)^29;
    }
 
    bool operator ==(const rolling_hash &a) const {
        return h1==a.h1 && h2==a.h2;
    }
 
    bool operator <(const rolling_hash &a) const {
        return h1==a.h1 ? h2<a.h2 : h1<a.h1;
    }
};
 
struct hash_rolling_hash {
    unsigned long long operator () (const rolling_hash &a) const {
        return a.h1^(a.h2<<30);
    }
};
 
struct item {
    rolling_hash hash;
    int from,to;
 
    item(){}
    item(rolling_hash a, int b, int c): hash(a), from(b), to(c) {}
    
    bool operator <(const item &a) const {
        return to-from+1==a.to-a.from+1 ? hash<a.hash : to-from+1<a.to-a.from+1;
    }
};
 
int n;
char a[N];
unsigned long long pw1[N],pw2[N];
rolling_hash ph[N],sh[N];
unordered_map < rolling_hash, pair < int, int >, hash_rolling_hash > interval;
unordered_map < rolling_hash, int, hash_rolling_hash > current_cnt;
priority_queue < item > q;
long long ans;
list < item > wait[N];
vector < char > enc;

inline rolling_hash get_prefix_hash(rolling_hash *a, int l, int r) {
    rolling_hash hl=a[l-1],hr=a[r];
 
    hl.h1*=pw1[r-l+1];
    hl.h2*=pw2[r-l+1];
 
    hr.h1-=hl.h1;
    hr.h2-=hl.h2;
    
    return hr;
}
 
inline rolling_hash get_suffix_hash(rolling_hash *a, int l, int r) {
    rolling_hash hl=a[l],hr=a[r+1];
    
    hr.h1*=pw1[r-l+1];
    hr.h2*=pw2[r-l+1];
 
    hl.h1-=hr.h1;
    hl.h2-=hr.h2;
 
    return hl;
}
 
inline bool is_palindrome(int l, int r) {
    return get_prefix_hash(ph,l,r)==get_suffix_hash(sh,l,r);
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int i,j;
    rolling_hash h;
 
    enc.resize(26);
    for(i=0;i<26;i++) enc[i]='a'+i;

    random_shuffle(enc.begin(),enc.end());
    random_shuffle(enc.begin(),enc.end());

    pw1[0]=pw2[0]=1;
    for(i=1;i<N;i++) {
        pw1[i]=pw1[i-1]*B1;
        pw2[i]=pw2[i-1]*B2;
    }
 
    while((a[++n]=getchar_unlocked())!='\n');
    --n;

    for(i=1;i<=n;i++) a[i]=enc[a[i]-'a'];

    h=rolling_hash();
    for(i=1;i<=n;i++) {
        h.append(a[i]);
        ph[i]=h;
    }
 
    h=rolling_hash();
    for(i=n;i>=1;i--) {
        h.append(a[i]);
        sh[i]=h;
    }
 
    for(i=1;i<=n;i++) {
        int left=0,right=min(i,n-i+1),middle;
 
        while(right-left>1) {
            middle=(left+right)/2;
            
            if(is_palindrome(i-middle,i+middle)) left=middle;
            else right=middle;
        }

        for(j=left;j>=0;j--) {
            h=get_prefix_hash(ph,i-j,i+j);
 
            if(interval.find(h)!=interval.end()) break;
            
            wait[2*j+1].push_back(item(h,i-j,i+j));
            interval[h]=make_pair(i-j,i+j);
        }
 
        h=get_prefix_hash(ph,i-left,i+left);
        ++current_cnt[h];
    }
 
    for(i=1;i<n;i++) if(a[i]==a[i+1]) {
        int left=0,right=min(i,n-i),middle;
        
        while(right-left>1) {
            middle=(left+right)/2;
 
            if(is_palindrome(i-middle,i+1+middle)) left=middle;
            else right=middle;
        }
 
        for(j=left;j>=0;j--) {
            h=get_prefix_hash(ph,i-j,i+1+j);
 
            if(interval.find(h)!=interval.end()) break;
            
            wait[2*j+2].push_back(item(h,i-j,i+1+j));
            interval[h]=make_pair(i-j,i+1+j);
        }
 
        h=get_prefix_hash(ph,i-left,i+1+left);
        ++current_cnt[h];
    }

    for(i=n;i>2;i--) {
        for(item curr: wait[i]) {
            int cnt=current_cnt[curr.hash];
            long long curr_ans=cnt*1ll*i;
            current_cnt.erase(curr.hash);
 
            if(curr_ans>ans) {
                ans=curr_ans;
            }
 
            curr.hash=get_prefix_hash(ph,curr.from+1,curr.to-1);
            pair < int, int > seg=interval[curr.hash];
            curr.from=seg.first;
            curr.to=seg.second;
            current_cnt[curr.hash]+=cnt;
        }
    }
 
    for(;i>=1;i--) {
        for(item curr: wait[i]) { 
            int cnt=current_cnt[curr.hash];
            long long curr_ans=cnt*1ll*i;
 
            if(curr_ans>ans) {
                ans=curr_ans;
            }
        }
    }
 
    printf("%lld\n", ans);
    
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 19 ms 21496 KB Output is correct
2 Correct 18 ms 21608 KB Output is correct
3 Correct 17 ms 21608 KB Output is correct
4 Correct 17 ms 21608 KB Output is correct
5 Correct 20 ms 21608 KB Output is correct
6 Correct 17 ms 21668 KB Output is correct
7 Correct 21 ms 21668 KB Output is correct
8 Correct 21 ms 21668 KB Output is correct
9 Correct 16 ms 21668 KB Output is correct
10 Correct 17 ms 21716 KB Output is correct
11 Correct 16 ms 21732 KB Output is correct
12 Correct 17 ms 21860 KB Output is correct
13 Correct 17 ms 21860 KB Output is correct
14 Correct 17 ms 21860 KB Output is correct
15 Correct 19 ms 21860 KB Output is correct
16 Correct 20 ms 21860 KB Output is correct
17 Correct 17 ms 21860 KB Output is correct
18 Correct 17 ms 21860 KB Output is correct
19 Correct 20 ms 21860 KB Output is correct
20 Correct 18 ms 21860 KB Output is correct
21 Correct 17 ms 21860 KB Output is correct
22 Correct 17 ms 21860 KB Output is correct
23 Correct 17 ms 21860 KB Output is correct
24 Correct 18 ms 21860 KB Output is correct
25 Correct 16 ms 21860 KB Output is correct
26 Correct 17 ms 21860 KB Output is correct
27 Correct 17 ms 21860 KB Output is correct
28 Correct 18 ms 21860 KB Output is correct
29 Correct 17 ms 21860 KB Output is correct
30 Correct 17 ms 21860 KB Output is correct
31 Correct 18 ms 21860 KB Output is correct
32 Correct 16 ms 21860 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 18 ms 22012 KB Output is correct
2 Correct 18 ms 22012 KB Output is correct
3 Correct 18 ms 22012 KB Output is correct
4 Correct 22 ms 22012 KB Output is correct
5 Correct 19 ms 22012 KB Output is correct
6 Correct 18 ms 22012 KB Output is correct
7 Correct 18 ms 22012 KB Output is correct
8 Correct 18 ms 22012 KB Output is correct
9 Correct 21 ms 22012 KB Output is correct
10 Correct 18 ms 22012 KB Output is correct
11 Correct 17 ms 22012 KB Output is correct
12 Correct 18 ms 22012 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 23296 KB Output is correct
2 Correct 26 ms 23296 KB Output is correct
3 Correct 29 ms 23396 KB Output is correct
4 Correct 28 ms 23396 KB Output is correct
5 Correct 25 ms 23396 KB Output is correct
6 Correct 25 ms 23396 KB Output is correct
7 Correct 27 ms 23396 KB Output is correct
8 Correct 19 ms 23396 KB Output is correct
9 Correct 20 ms 23396 KB Output is correct
10 Incorrect 21 ms 23396 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 232 ms 37784 KB Output is correct
2 Correct 211 ms 37784 KB Output is correct
3 Correct 264 ms 37784 KB Output is correct
4 Correct 241 ms 37784 KB Output is correct
5 Correct 175 ms 37784 KB Output is correct
6 Correct 136 ms 37784 KB Output is correct
7 Correct 188 ms 37784 KB Output is correct
8 Correct 45 ms 37784 KB Output is correct
9 Correct 70 ms 37784 KB Output is correct
10 Incorrect 84 ms 37784 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 770 ms 62532 KB Output is correct
2 Correct 752 ms 63820 KB Output is correct
3 Correct 948 ms 71448 KB Output is correct
4 Correct 953 ms 71448 KB Output is correct
5 Correct 550 ms 71448 KB Output is correct
6 Correct 724 ms 71448 KB Output is correct
7 Correct 684 ms 71448 KB Output is correct
8 Correct 118 ms 71448 KB Output is correct
9 Correct 111 ms 71448 KB Output is correct
10 Incorrect 316 ms 71448 KB Output isn't correct
11 Halted 0 ms 0 KB -