Submission #234848

#TimeUsernameProblemLanguageResultExecution timeMemory
234848jhnah917Palindromes (APIO14_palindrome)C++14
Compilation error
0 ms0 KiB
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
const ll p1 = 179, mod1 = 1e9-63;
const ll p2 = 917, mod2 = 1e9+7;

struct pair_hash{
  template <typename T1, typanameT2>
  size_t operator () (const pair<T1, T2> &t) const {
    return std::hash<T1>()(t.first) ^ std::hash<T2>()(t.second);
  }
};
 
int n;
char s[606060];
int dp[606060];
ll ha1[303030], pw1[303030];
ll ha2[303030], pw2[303030];
 
int pv = 0;
unordered_map<pair<ll, ll>, int, pair_hash> mp;
int cnt[303030];
int len[303030];
int lnk[303030];
vector<int> g[303030];
 
void manacher(){
    for(int i=n-1; i>=0; i--){
        s[i << 1 | 1] = s[i];
        s[i << 1] = '#';
    }
    n <<= 1; s[n++] = '#';
    int r = -1, p = -1;
    for(int i=0; i<n; i++){
        dp[i] = (i <= r ? min(dp[p*2-i], r-i) : 0);
        while(i-dp[i]-1 >= 0 && i+dp[i]+1 < n && s[i-dp[i]-1] == s[i+dp[i]+1]) dp[i]++;
        if(i+dp[i] > r) r = i+dp[i], p = i;
    }
}
pair<ll, ll> substr(int l, int r){
    ll r1 = ha1[l] - ha1[r+1] * pw1[r-l+1]; r1 %= mod1; if(r1 < 0) r1 += mod1;
    ll r2 = ha2[l] - ha2[r+1] * pw2[r-l+1]; r2 %= mod2; if(r2 < 0) r2 += mod2;
    return {r1, r2};
}
 
void go(int s, int e, pair<ll, ll> now){
    if(e-s+1 <= 2) return;
    auto par = substr(s+1, e-1);
    int v = mp[now], u;
    if(!mp.count(par)){
        u = mp[par] = ++pv; len[u] = e-s-1;
    }else u = mp[par];
    if(lnk[v]) return; lnk[v] = 1;
    g[u].push_back(v);
    go(s+1, e-1, par);
}
 
int sz[303030];
int chk[303030];
void dfs(int v){
    sz[v] = cnt[v];
    chk[v] = 1;
    for(auto i : g[v]){
        if(chk[i]) continue;
        dfs(i); sz[v] += sz[i];
    }
}
 
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> s; n = strlen(s);
    pw1[0] = 1, pw1[1] = p1;
    pw2[0] = 1, pw2[1] = p2;
    for(int i=n-1; i>=0; i--) ha1[i] = (ha1[i+1] * p1 + s[i]) % mod1;
    for(int i=2; i<=n; i++) pw1[i] = pw1[i-1] * p1 % mod1;
    for(int i=n-1; i>=0; i--) ha2[i] = (ha2[i+1] * p2 + s[i]) % mod2;
    for(int i=2; i<=n; i++) pw2[i] = pw2[i-1] * p2 % mod2;
    manacher();
 
    //for(int i=0; i<n; i++) cout << s[i] << " "; cout << "\n";
    //for(int i=0; i<n; i++) cout << dp[i] << " "; cout << "\n";
 
    for(int i=0; i<n; i++){
        if(!dp[i]) continue;
        int s, e;
        if(i & 1) s = i/2-dp[i]/2, e = i/2+dp[i]/2;
        else{
            s = i-1, e = i+1; s /= 2, e /= 2;
            s -= dp[i]/2-1;
            e += dp[i]/2-1;
        }
        auto now = substr(s, e);
        if(!mp.count(now)){
            mp[now] = ++pv; len[mp[now]] = e-s+1;
        }
        cnt[mp[now]]++;
        go(s, e, now);
    }
 
    ll ans = 0;
    for(int i=1; i<=pv; i++) if(!sz[i]) dfs(i);
    for(int i=1; i<=pv; i++){
        ans = max(ans, (ll)len[i] * sz[i]);
    }
    cout << ans;
};
 
// banana

Compilation message (stderr)

palindrome.cpp:11:26: error: 'typanameT2' has not been declared
   template <typename T1, typanameT2>
                          ^~~~~~~~~~
palindrome.cpp:12:38: error: 'T2' was not declared in this scope
   size_t operator () (const pair<T1, T2> &t) const {
                                      ^~
palindrome.cpp:12:38: note: suggested alternative: 'p2'
   size_t operator () (const pair<T1, T2> &t) const {
                                      ^~
                                      p2
palindrome.cpp:12:40: error: template argument 2 is invalid
   size_t operator () (const pair<T1, T2> &t) const {
                                        ^
palindrome.cpp: In member function 'size_t pair_hash::operator()(const int&) const':
palindrome.cpp:13:30: error: request for member 'first' in 't', which is of non-class type 'const int'
     return std::hash<T1>()(t.first) ^ std::hash<T2>()(t.second);
                              ^~~~~
palindrome.cpp:13:49: error: 'T2' was not declared in this scope
     return std::hash<T1>()(t.first) ^ std::hash<T2>()(t.second);
                                                 ^~
palindrome.cpp:13:49: note: suggested alternative: 'T1'
     return std::hash<T1>()(t.first) ^ std::hash<T2>()(t.second);
                                                 ^~
                                                 T1
palindrome.cpp:13:51: error: template argument 1 is invalid
     return std::hash<T1>()(t.first) ^ std::hash<T2>()(t.second);
                                                   ^
palindrome.cpp:13:57: error: request for member 'second' in 't', which is of non-class type 'const int'
     return std::hash<T1>()(t.first) ^ std::hash<T2>()(t.second);
                                                         ^~~~~~
In file included from /usr/include/c++/7/bits/hashtable.h:35:0,
                 from /usr/include/c++/7/unordered_map:47,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:117,
                 from palindrome.cpp:3:
/usr/include/c++/7/bits/hashtable_policy.h: In instantiation of 'struct std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash>':
/usr/include/c++/7/type_traits:143:12:   required from 'struct std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> >'
/usr/include/c++/7/type_traits:154:31:   required from 'struct std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
/usr/include/c++/7/bits/unordered_map.h:103:66:   required from 'class std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>'
palindrome.cpp:24:45:   required from here
/usr/include/c++/7/bits/hashtable_policy.h:87:34: error: no match for call to '(const pair_hash) (const std::pair<long long int, long long int>&)'
  noexcept(declval<const _Hash&>()(declval<const _Key&>()))>
           ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
palindrome.cpp:12:10: note: candidate: template<class T1, <typeprefixerror><anonymous> > size_t pair_hash::operator()(const int&) const
   size_t operator () (const pair<T1, T2> &t) const {
          ^~~~~~~~
palindrome.cpp:12:10: note:   template argument deduction/substitution failed:
In file included from /usr/include/c++/7/bits/hashtable.h:35:0,
                 from /usr/include/c++/7/unordered_map:47,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:117,
                 from palindrome.cpp:3:
/usr/include/c++/7/bits/hashtable_policy.h:87:34: note:   couldn't deduce template parameter 'T1'
  noexcept(declval<const _Hash&>()(declval<const _Key&>()))>
           ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/7/bits/move.h:54:0,
                 from /usr/include/c++/7/bits/nested_exception.h:40,
                 from /usr/include/c++/7/exception:143,
                 from /usr/include/c++/7/ios:39,
                 from /usr/include/c++/7/istream:38,
                 from /usr/include/c++/7/sstream:38,
                 from /usr/include/c++/7/complex:45,
                 from /usr/include/c++/7/ccomplex:39,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:52,
                 from palindrome.cpp:3:
/usr/include/c++/7/type_traits: In instantiation of 'struct std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >':
/usr/include/c++/7/bits/unordered_map.h:103:66:   required from 'class std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>'
palindrome.cpp:24:45:   required from here
/usr/include/c++/7/type_traits:154:31: error: 'value' is not a member of 'std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> >'
     : public __bool_constant<!bool(_Pp::value)>
                               ^~~~~~~~~~~~~~~~
In file included from /usr/include/c++/7/unordered_map:48:0,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:117,
                 from palindrome.cpp:3:
/usr/include/c++/7/bits/unordered_map.h: In instantiation of 'class std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>':
palindrome.cpp:24:45:   required from here
/usr/include/c++/7/bits/unordered_map.h:103:66: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
                                                                  ^~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:110:45: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::key_type key_type;
                                             ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:111:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::value_type value_type;
                                               ^~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:112:48: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::mapped_type mapped_type;
                                                ^~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:113:43: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::hasher hasher;
                                           ^~~~~~
/usr/include/c++/7/bits/unordered_map.h:114:46: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::key_equal key_equal;
                                              ^~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:115:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::allocator_type allocator_type;
                                                   ^~~~~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:120:45: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::pointer  pointer;
                                             ^~~~~~~
/usr/include/c++/7/bits/unordered_map.h:121:50: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::const_pointer const_pointer;
                                                  ^~~~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:122:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::reference  reference;
                                               ^~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:123:52: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::const_reference const_reference;
                                                    ^~~~~~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:124:46: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::iterator  iterator;
                                              ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:125:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::const_iterator const_iterator;
                                                   ^~~~~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:126:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::local_iterator local_iterator;
                                                   ^~~~~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:127:57: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::const_local_iterator const_local_iterator;
                                                         ^~~~~~~~~~~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:128:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::size_type  size_type;
                                               ^~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:129:52: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       typedef typename _Hashtable::difference_type difference_type;
                                                    ^~~~~~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:288:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       operator=(initializer_list<value_type> __l)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:386:2: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
  emplace(_Args&&... __args)
  ^~~~~~~
/usr/include/c++/7/bits/unordered_map.h:578:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       insert(const value_type& __x)
       ^~~~~~
/usr/include/c++/7/bits/unordered_map.h:584:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       insert(value_type&& __x)
       ^~~~~~
/usr/include/c++/7/bits/unordered_map.h:591:2: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
  insert(_Pair&& __x)
  ^~~~~~
/usr/include/c++/7/bits/unordered_map.h:657:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       insert(initializer_list<value_type> __l)
       ^~~~~~
/usr/include/c++/7/bits/unordered_map.h:953:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       equal_range(const key_type& __x)
       ^~~~~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:957:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<pair_hash>, std::__detail::__is_noexcept_hash<std::pair<long long int, long long int>, pair_hash> > >'
       equal_range(const key_type& __x) const
       ^~~~~~~~~~~
palindrome.cpp: In function 'void go(int, int, std::pair<long long int, long long int>)':
palindrome.cpp:52:15: error: no match for 'operator[]' (operand types are 'std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' and 'std::pair<long long int, long long int>')
     int v = mp[now], u;
               ^
palindrome.cpp:53:12: error: 'class std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' has no member named 'count'
     if(!mp.count(par)){
            ^~~~~
palindrome.cpp:54:9: error: 'u' was not declared in this scope
         u = mp[par] = ++pv; len[u] = e-s-1;
         ^
palindrome.cpp:54:15: error: no match for 'operator[]' (operand types are 'std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' and 'std::pair<long long int, long long int>')
         u = mp[par] = ++pv; len[u] = e-s-1;
               ^
palindrome.cpp:55:11: error: 'u' was not declared in this scope
     }else u = mp[par];
           ^
palindrome.cpp:55:17: error: no match for 'operator[]' (operand types are 'std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' and 'std::pair<long long int, long long int>')
     }else u = mp[par];
                 ^
palindrome.cpp:56:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
     if(lnk[v]) return; lnk[v] = 1;
     ^~
palindrome.cpp:56:24: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
     if(lnk[v]) return; lnk[v] = 1;
                        ^~~
palindrome.cpp:57:7: error: 'u' was not declared in this scope
     g[u].push_back(v);
       ^
palindrome.cpp: In function 'int main()':
palindrome.cpp:96:16: error: 'class std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' has no member named 'count'
         if(!mp.count(now)){
                ^~~~~
palindrome.cpp:97:15: error: no match for 'operator[]' (operand types are 'std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' and 'std::pair<long long int, long long int>')
             mp[now] = ++pv; len[mp[now]] = e-s+1;
               ^
palindrome.cpp:97:35: error: no match for 'operator[]' (operand types are 'std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' and 'std::pair<long long int, long long int>')
             mp[now] = ++pv; len[mp[now]] = e-s+1;
                                   ^
palindrome.cpp:99:15: error: no match for 'operator[]' (operand types are 'std::unordered_map<std::pair<long long int, long long int>, int, pair_hash>' and 'std::pair<long long int, long long int>')
         cnt[mp[now]]++;
               ^