Advertisement
SorahISA

[TIOJ 1276] 對稱之山 (manacher)

Apr 9th, 2020
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. /* https://tioj.ck.tp.edu.tw/problems/1276 */
  2.  
  3. // #pragma GCC target("avx2")
  4. #pragma GCC optimize("O3", "unroll-loops")
  5.  
  6. // #include <bits/extc++.h>
  7. // using namespace __gnu_pbds;
  8.  
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11.  
  12. // #define int long long
  13. #define double long double
  14. // template <typename T>
  15. // using pbds_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  16. using pii = pair<int, int>;
  17. template<typename T>
  18. using prior = priority_queue<T, vector<T>, greater<T>>;
  19. template<typename T>
  20. using Prior = priority_queue<T>;
  21.  
  22. #define X first
  23. #define Y second
  24. #define ALL(x) (x).begin(), (x).end()
  25. #define eb emplace_back
  26. #define pb push_back
  27.  
  28. #define fastIO() ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  29. #define RANDOM() random_device __rd; \
  30.                  mt19937 __gen = mt19937(__rd()); \
  31.                  uniform_int_distribution<int> __dis(0, 1); \
  32.                  auto rnd = bind(__dis, __gen);
  33.  
  34. const int INF = 1E9;
  35. const int mod = 1E9 + 7;
  36. const int maxn = 2E7 + 5;
  37.  
  38. vector<int> palin(maxn, 0);
  39.  
  40. int32_t main() {
  41.     // fastIO();
  42.    
  43.     int n, sz;
  44.     scanf("%d", &n), sz = 2*n + 1;
  45.    
  46.     vector<int> v(sz, INF);
  47.     for (int i = 1; i < sz; i += 2) scanf("%d", &v[i]);
  48.    
  49.     int maxL = 0, maxR = -1;
  50.     for (int i = 0; i < sz; ++i) {
  51.         if (i > maxR) {
  52.             for (int len = 0; i-len >= 0 and i+len < sz; ++len) {
  53.                 if (v[i-len] == v[i+len]) ++palin[i];
  54.                 else break;
  55.             }
  56.             maxL = i - palin[i] + 1;
  57.             maxR = i + palin[i] - 1;
  58.         }
  59.         else {
  60.             int mir = maxL + maxR - i;
  61.             palin[i] = min(maxR - i, palin[mir]);
  62.            
  63.             if (palin[i] == maxR - i) {
  64.                 for (int len = palin[i]; i-len >= 0 and i+len < sz; ++len) {
  65.                     if (v[i-len] == v[i+len]) ++palin[i];
  66.                     else break;
  67.                 }
  68.                 maxL = i - palin[i] + 1;
  69.                 maxR = i + palin[i] - 1;
  70.             }
  71.         }
  72.     }
  73.    
  74.     int ans = 0;
  75.     for (int i = 0; i < sz; ++i) ans = max(ans, palin[i] - 1);
  76.    
  77.     printf("%d\n", ans-1);
  78.    
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement