Submission #46105

# Submission time Handle Problem Language Result Execution time Memory
46105 2018-04-17T10:20:42 Z Extazy Palindromes (APIO14_palindrome) C++17
73 / 100
1000 ms 43212 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,h2;
    
    rolling_hash(): h1(0), h2(0) {}
 
    void append(char a) {
        h1*=B1;
        h1+=a-'a'+1;
        h2*=B2;
        h2+=a-'a'+1;
        h2%=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 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];
map < rolling_hash, pair < int, int > > interval;
map < rolling_hash, int > current_cnt;
set < item > s;
long long ans;
 
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];
    hl.h2%=MOD;
 
    hr.h1-=hl.h1;
    hr.h2-=hl.h2;
    hr.h2+=MOD;
    hr.h2%=MOD;
    
    return hr;
}
 
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];
    hr.h2%=MOD;
 
    hl.h1-=hr.h1;
    hl.h2-=hr.h2;
    hl.h2+=MOD;
    hl.h2%=MOD;
 
    return hl;
}
 
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]*B2%MOD;
    }
 
    scanf("%s", a+1);
    n=strlen(a+1);
 
    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;
            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;
            interval[h]=make_pair(i-j,i+1+j);
        }
 
        h=get_prefix_hash(ph,i-left,i+1+left);
        ++current_cnt[h];
    }
 
    for(map < rolling_hash, int >::iterator it=current_cnt.begin();it!=current_cnt.end();it++) {
        h=it->first;
        pair < int, int > seg=interval[h];
 
        s.insert(item(h,seg.first,seg.second));
    }
 
    while(!s.empty()) {
        item curr=*s.begin();
        s.erase(s.begin());
        int cnt=current_cnt[curr.hash];

        ans=max(ans,cnt*1ll*(curr.to-curr.from+1));
 
        if(curr.to-curr.from+1>2) {
            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;
            s.insert(curr);
        }
    }
 
    printf("%lld\n", ans);
    
    return 0;
}

Compilation message

palindrome.cpp: In function 'int main()':
palindrome.cpp:98:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%s", a+1);
     ~~~~~^~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 13 ms 14456 KB Output is correct
2 Correct 12 ms 14504 KB Output is correct
3 Correct 12 ms 14516 KB Output is correct
4 Correct 12 ms 14552 KB Output is correct
5 Correct 13 ms 14552 KB Output is correct
6 Correct 14 ms 14552 KB Output is correct
7 Correct 13 ms 14552 KB Output is correct
8 Correct 14 ms 14552 KB Output is correct
9 Correct 13 ms 14600 KB Output is correct
10 Correct 12 ms 14736 KB Output is correct
11 Correct 13 ms 14736 KB Output is correct
12 Correct 13 ms 14736 KB Output is correct
13 Correct 14 ms 14736 KB Output is correct
14 Correct 13 ms 14736 KB Output is correct
15 Correct 12 ms 14736 KB Output is correct
16 Correct 13 ms 14736 KB Output is correct
17 Correct 13 ms 14736 KB Output is correct
18 Correct 15 ms 14736 KB Output is correct
19 Correct 14 ms 14736 KB Output is correct
20 Correct 14 ms 14736 KB Output is correct
21 Correct 13 ms 14736 KB Output is correct
22 Correct 13 ms 14736 KB Output is correct
23 Correct 13 ms 14736 KB Output is correct
24 Correct 13 ms 14736 KB Output is correct
25 Correct 12 ms 14736 KB Output is correct
26 Correct 13 ms 14736 KB Output is correct
27 Correct 12 ms 14736 KB Output is correct
28 Correct 14 ms 14736 KB Output is correct
29 Correct 13 ms 14736 KB Output is correct
30 Correct 14 ms 14736 KB Output is correct
31 Correct 13 ms 14736 KB Output is correct
32 Correct 13 ms 14736 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 14848 KB Output is correct
2 Correct 17 ms 14848 KB Output is correct
3 Correct 15 ms 14976 KB Output is correct
4 Correct 15 ms 14976 KB Output is correct
5 Correct 16 ms 14976 KB Output is correct
6 Correct 15 ms 14976 KB Output is correct
7 Correct 15 ms 14976 KB Output is correct
8 Correct 14 ms 14976 KB Output is correct
9 Correct 14 ms 14976 KB Output is correct
10 Correct 13 ms 14976 KB Output is correct
11 Correct 13 ms 14976 KB Output is correct
12 Correct 15 ms 14976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 38 ms 16632 KB Output is correct
2 Correct 35 ms 16632 KB Output is correct
3 Correct 47 ms 16632 KB Output is correct
4 Correct 44 ms 16632 KB Output is correct
5 Correct 27 ms 16632 KB Output is correct
6 Correct 31 ms 16632 KB Output is correct
7 Correct 38 ms 16632 KB Output is correct
8 Correct 16 ms 16632 KB Output is correct
9 Correct 16 ms 16632 KB Output is correct
10 Correct 23 ms 16632 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 666 ms 33628 KB Output is correct
2 Correct 583 ms 33628 KB Output is correct
3 Correct 769 ms 33628 KB Output is correct
4 Correct 735 ms 33760 KB Output is correct
5 Correct 379 ms 33760 KB Output is correct
6 Correct 330 ms 33760 KB Output is correct
7 Correct 535 ms 33760 KB Output is correct
8 Correct 74 ms 33760 KB Output is correct
9 Correct 197 ms 33760 KB Output is correct
10 Correct 332 ms 33760 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 1086 ms 43212 KB Time limit exceeded
2 Halted 0 ms 0 KB -