제출 #1326725

#제출 시각아이디문제언어결과실행 시간메모리
1326725SSKMFPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
109 ms17056 KiB
#include <bits/stdc++.h> using namespace std; const int mod_1(1000000007) , mod_2(998244353); const int baza_1(31) , baza_2(29); int putere[1000001][2] , prefix[1000001][2]; char sir[1000001]; inline pair <int , int> Query (const int stanga , const int dreapta) { return make_pair( (prefix[dreapta][0] - 1LL * prefix[stanga - 1][0] * putere[dreapta - stanga + 1][0] % mod_1 + mod_1) % mod_1 , (prefix[dreapta][1] - 1LL * prefix[stanga - 1][1] * putere[dreapta - stanga + 1][1] % mod_2 + mod_2) % mod_2 ); } inline void Solve () { cin >> sir; const int lungime = (int)strlen(sir); for (int indice = 1 ; indice <= lungime ; indice++) { prefix[indice][0] = (1LL * prefix[indice - 1][0] * baza_1 + (sir[indice - 1] - 'a')) % mod_1; prefix[indice][1] = (1LL * prefix[indice - 1][1] * baza_2 + (sir[indice - 1] - 'a')) % mod_2; } int stanga = 1 , dreapta = lungime , maxim = 0; while (stanga < dreapta) { int candidat = 0; while (stanga + candidat < dreapta - candidat && Query(stanga , stanga + candidat) != Query(dreapta - candidat , dreapta)) { candidat++; } if (stanga + candidat >= dreapta - candidat) { break; } maxim += 2; stanga += candidat + 1; dreapta -= candidat + 1; } maxim += (stanga <= dreapta ? 1 : 0); cout << maxim << '\n'; } int main () { ios :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); putere[0][0] = putere[0][1] = 1; for (int exponent = 1 ; exponent <= 1000000 ; exponent++) { putere[exponent][0] = 1LL * putere[exponent - 1][0] * baza_1 % mod_1; putere[exponent][1] = 1LL * putere[exponent - 1][1] * baza_2 % mod_2; } int numar_teste; cin >> numar_teste; while (numar_teste--) { 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...