#include <bits/stdc++.h>
using namespace std;
long long P1 = 1000000007, P2 = 1000000009;
pair<long long, long long> b = {1024, 2048};
void Add(pair<long long, long long>& a, pair<long long, long long> b) {
a.first += b.first; if (a.first >= P1) a.first -= P1;
a.second += b.second; if (a.second >= P2) a.second -= P2;
return;
}
void Sub(pair<long long, long long>& a, pair<long long, long long> b) {
a.first -= b.first; if (a.first < 0) a.first += P1;
a.second -= b.second; if (a.second < 0) a.second += P2;
return;
}
void Mul(pair<long long, long long>& a, pair<long long, long long> b) {
a.first = (a.first*b.first)%P1;
a.second = (a.second*b.second)%P2;
return;
}
vector<pair<long long, long long>> bpw(1234567);
void pc() {
long long n = bpw.size(),i;
bpw[0] = {1,1};
i = 0; while (++i < n) {bpw[i] = bpw[i-1]; Mul(bpw[i], b);}
}
vector<pair<long long, long long>> PH;
void calcPH(vector<long long>& A) {
long long n = A.size(), i, j;
vector<pair<long long, long long>> ok(n); PH = ok;
i = -1; while (++i < n) {
pair<long long, long long> V = {A[i], A[i]};
Mul(V, bpw[i]);
PH[i] = V;
if (i) Add(PH[i], PH[i-1]);
}
}
bool comp(long long l1, long long r1, long long l2, long long r2) {
if ((r1-l1) != (r2-l2)) return false;
if (l2 < l1) {
swap(l1, l2); swap(r1, r2);
}
pair<long long, long long> v1 = PH[r1], v2 = PH[r2];
if (l1) Sub(v1, PH[l1-1]);
if (l2) Sub(v2, PH[l2-1]);
long long d = l2-l1;
Mul(v1, bpw[d]);
return v1 == v2;
}
int main() {
//freopen("SIXCUP.inp","r",stdin);
//freopen("SIXCUP.out","w",stdout);
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
pc();
int T; cin >> T;
while (T--) {
string s; cin >> s;
long long n = s.size(), i, j;
vector<long long> A(n); i = -1; while (++i < n) A[i] = s[i];
calcPH(A);
if (n == 1) {
cout << 1 << "\n";
continue;
}
//3 = 0
//4 = 1
long long ep = (n/2)-1;
long long lst = -1;
long long ans = 0;
i = -1; while (i++ < ep) {
long long l1 = lst+1, r1 = i;
long long l2 = n-1-r1, r2 = n-1-l1;
if (comp(l1, r1, l2, r2)) {
ans += 2; lst = r1;
}
}
if ((lst != ep) || (n%2)) ans++;
cout << ans << "\n";
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |