Submission #46181

# Submission time Handle Problem Language Result Execution time Memory
46181 2018-04-17T12:23:20 Z Extazy Palindromes (APIO14_palindrome) C++17
23 / 100
1000 ms 60636 KB
#include <bits/stdc++.h>
#define endl '\n'
 
using namespace std;
 
const unsigned long long B1 = 131, B2 = 137, MOD = (1e9) + 7;
const int N = 300007;
 
struct rolling_hash {
    unsigned long long h1;
    unsigned h2;
    
    rolling_hash(): h1(0), h2(0) {}
 
    void append(char a) {
        h1*=B1;
        h1+=a-'a'+1;
        h2=(h2*1llu*B2+a-'a'+1)%MOD;
    }
 
    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 {
    unsigned long long hash;
    int from,to;
 
    item(){}
    item(unsigned long long 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];
unsigned pw2[N];
rolling_hash ph[N],sh[N];
unordered_map < unsigned long long, pair < int, int > > interval;
unordered_map < unsigned long long, int > current_cnt;
priority_queue < item > q;
long long ans;
list < item > wait[N];
 
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=hl.h2*1llu*pw2[r-l+1]%MOD;
 
    hr.h1-=hl.h1;
    hr.h2-=hl.h2;
    hr.h2+=MOD;
    hr.h2%=MOD;
    
    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=hr.h2*1llu*pw2[r-l+1]%MOD;
 
    hl.h1-=hr.h1;
    hl.h2-=hr.h2;
    hl.h2+=MOD;
    hl.h2%=MOD;
 
    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;
 
    pw1[0]=pw2[0]=1;
    for(i=1;i<N;i++) {
        pw1[i]=pw1[i-1]*B1;
        pw2[i]=pw2[i-1]*1llu*B2%MOD;
    }
 
    while((a[++n]=getchar_unlocked())!='\n');
    --n;
 
    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.h1)!=interval.end()) break;
            
            wait[2*j+1].push_back(item(h.h1,i-j,i+j));
            interval[h.h1]=make_pair(i-j,i+j);
        }
 
        h=get_prefix_hash(ph,i-left,i+left);
        ++current_cnt[h.h1];
    }
 
    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.h1)!=interval.end()) break;
            
            wait[2*j+2].push_back(item(h.h1,i-j,i+1+j));
            interval[h.h1]=make_pair(i-j,i+1+j);
        }
 
        h=get_prefix_hash(ph,i-left,i+1+left);
        ++current_cnt[h.h1];
    }
 
    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).h1;
            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 18 ms 20240 KB Output is correct
2 Correct 17 ms 20324 KB Output is correct
3 Correct 17 ms 20528 KB Output is correct
4 Correct 17 ms 20592 KB Output is correct
5 Correct 18 ms 20592 KB Output is correct
6 Correct 17 ms 20652 KB Output is correct
7 Correct 19 ms 20652 KB Output is correct
8 Correct 17 ms 20652 KB Output is correct
9 Correct 18 ms 20652 KB Output is correct
10 Correct 18 ms 20652 KB Output is correct
11 Correct 18 ms 20652 KB Output is correct
12 Correct 17 ms 20652 KB Output is correct
13 Correct 18 ms 20652 KB Output is correct
14 Correct 17 ms 20652 KB Output is correct
15 Correct 17 ms 20652 KB Output is correct
16 Correct 17 ms 20652 KB Output is correct
17 Correct 21 ms 20652 KB Output is correct
18 Correct 18 ms 20652 KB Output is correct
19 Correct 18 ms 20652 KB Output is correct
20 Correct 21 ms 20652 KB Output is correct
21 Correct 18 ms 20652 KB Output is correct
22 Correct 18 ms 20652 KB Output is correct
23 Correct 18 ms 20652 KB Output is correct
24 Correct 19 ms 20652 KB Output is correct
25 Correct 20 ms 20652 KB Output is correct
26 Correct 18 ms 20652 KB Output is correct
27 Correct 19 ms 20652 KB Output is correct
28 Correct 18 ms 20652 KB Output is correct
29 Correct 18 ms 20652 KB Output is correct
30 Correct 18 ms 20652 KB Output is correct
31 Correct 18 ms 20652 KB Output is correct
32 Correct 18 ms 20652 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 20708 KB Output is correct
2 Correct 18 ms 20708 KB Output is correct
3 Correct 19 ms 20708 KB Output is correct
4 Correct 18 ms 20708 KB Output is correct
5 Correct 19 ms 20708 KB Output is correct
6 Correct 19 ms 20708 KB Output is correct
7 Correct 18 ms 20708 KB Output is correct
8 Correct 18 ms 20708 KB Output is correct
9 Correct 18 ms 20708 KB Output is correct
10 Correct 19 ms 20708 KB Output is correct
11 Correct 22 ms 20708 KB Output is correct
12 Correct 19 ms 20708 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 28 ms 21836 KB Output is correct
2 Correct 31 ms 21836 KB Output is correct
3 Correct 28 ms 21860 KB Output is correct
4 Correct 30 ms 21860 KB Output is correct
5 Correct 25 ms 21860 KB Output is correct
6 Correct 26 ms 21860 KB Output is correct
7 Correct 27 ms 21860 KB Output is correct
8 Correct 20 ms 21860 KB Output is correct
9 Correct 22 ms 21860 KB Output is correct
10 Incorrect 22 ms 21860 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 238 ms 33328 KB Output is correct
2 Correct 194 ms 33328 KB Output is correct
3 Correct 230 ms 33416 KB Output is correct
4 Correct 251 ms 33416 KB Output is correct
5 Correct 148 ms 33416 KB Output is correct
6 Correct 132 ms 33416 KB Output is correct
7 Correct 212 ms 33416 KB Output is correct
8 Correct 46 ms 33416 KB Output is correct
9 Correct 113 ms 33416 KB Output is correct
10 Incorrect 77 ms 33416 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 745 ms 54276 KB Output is correct
2 Correct 702 ms 54976 KB Output is correct
3 Execution timed out 1000 ms 60636 KB Time limit exceeded
4 Halted 0 ms 0 KB -