Submission #1122302

#TimeUsernameProblemLanguageResultExecution timeMemory
1122302stakozPalindromic Partitions (CEOI17_palindromic)C++17
100 / 100
461 ms41736 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define debug(x) cerr << #x << ' ' << (x) << '\n'; typedef array<int, 2> F; F base = {2137, 2143}; F mod = {(int)1e9 + 7, (int)1e9 + 9}; void add(int &a, int b, int j){ a += b; if(a > mod[j]) a -= mod[j]; } void sub(int &a, int b, int j){ a -= b; if(0 > a) a += mod[j]; } int mul(int a, int b, int j){ return (a * b) % mod[j]; } void solve(){ //wczytywanie string s; cin >> s; int n = s.size(); s = "$" + s; //potegi vector<F> p(n + 2, {1, 1}); for(int i = 1; i <= n + 1; i++){ for(int j = 0; j < 2; j++){ p[i][j] = mul(p[i - 1][j], base[j], j); } } //hash??? vector<F> hash(n + 1); for(int i = 1; i <= n; i++){ hash[i] = hash[i - 1]; for(int j = 0; j < 2; j++){ add(hash[i][j], mul(s[i], p[i][j], j), j); } } int l = 0, lx = 0, r = n, rx = n; int seg_num = 0; bool finished = 0; while(!finished){ rx--; lx++; F curr_l = hash[lx], curr_r = hash[r]; for(int j = 0; j < 2; j++){ sub(curr_l[j], hash[l][j] , j); sub(curr_r[j], hash[rx][j] , j); } for(int j = 0; j < 2; j++){ curr_l[j] = mul(curr_l[j], p[r - lx][j], j); } if(rx < lx){ seg_num++; finished = true; break; } if(curr_l == curr_r){ seg_num += 2; l = lx; r = rx; if(l == r) finished = true; } } cout << seg_num << '\n'; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin >> q; while(q--){ solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...