Submission #850375

#TimeUsernameProblemLanguageResultExecution timeMemory
850375BenmathPalindromic Partitions (CEOI17_palindromic)C++14
100 / 100
1513 ms28040 KiB
/****************************************************************************** Online C++ Compiler. Code, Compile, Run and Debug C++ program online. Write your code in this editor and press "Run" button to compile and execute it. *******************************************************************************/ #include <bits/stdc++.h> using namespace std; int n; long long int prefiksnihash[1000001]; long long int stepen[1000001]; long long int stependvice[35]; long long int prost_stependvice[35]; long long int mod= 1e9 + 9; long long int prost= 67; long long int inv (long long int x, long long int y){ long long int step = 1e9 + 8 - y; long long int ans = 1; for(int j = 31; j>=0; j--){ if(step >= stependvice[j]){ step = step - stependvice[j]; ans = (ans * prost_stependvice[j]) % mod; } } return ans; } long long int podijeli(long long int a, long long int b , long long int y){ long long int rezultat = (a * inv(b,y)) % mod; return rezultat; } long long int calculate(int i, int j){ if(i > j){ swap(i,j); } if(i == 0){ return prefiksnihash[j]; }else{ long long int rezultat = (prefiksnihash[j] - prefiksnihash[i-1] + mod)%mod; return podijeli (rezultat, stepen[i], i); } } int main() { stepen[0] = 1; stependvice[0] = 1; for(int i = 1; i<=31; i++){ stependvice[i] = (stependvice[i-1] * 2); } prost_stependvice[0] = prost; for(int i = 1; i<=31; i++){ prost_stependvice[i] = (prost_stependvice[i-1] * prost_stependvice[i-1]) % mod; } for(int i = 1; i<=1000000; i++){ stepen[i] = (stepen[i-1] * prost) %mod; } int t; cin >> t; while (t--){ string s; cin >> s; n = s.size(); for(int i = 0; i < n; i++){ long long int vrijednostslova = s[i] - 'a' + 1; if (i == 0){ prefiksnihash[i] = vrijednostslova; }else { prefiksnihash[i] = (prefiksnihash[i-1] + vrijednostslova * stepen[i]) % mod; } } int odgovor = 0; int t1 = 0; int l = 0; int r = n-1; //cout << calculate(0,1) << " " << calculate(4,5)<<endl; while (t1 == 0){ int check = 0; int intervalprvi = -1; int intervaldrugi = -1; for (int i = l; i <= r; i++){ if (check > 0){ break; } int prvi1 = l; int prvi2 = i; int drugi2 = r; int drugi1 = r - (i - l); if (prvi2 < drugi1){ if (calculate(prvi1,prvi2) == calculate(drugi1,drugi2)){ odgovor = odgovor + 2; intervalprvi = prvi2 + 1; intervaldrugi = drugi1 - 1; check ++; break; } } } if (check == 0){ odgovor = odgovor + 1; break; } if (intervalprvi > intervaldrugi){ break; } l = intervalprvi; r = intervaldrugi; } cout << odgovor << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...