#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define ll long long
const int base1 = 31;
const int base2 = 37;
const int Lim = 1e6+6;
const int MOD1 = 1e9+3;
const int MOD2 = 1e9+7;
int t;
int n;
string s;
ll p1[Lim];
ll p2[Lim];
ll h1[Lim];
ll h2[Lim];
int ans = 0;
void input() {
cin >> s;
n = (int)s.size();
s = " " + s;
}
void build_hash() {
p1[0] = 1;
p2[0] = 1;
for ( int i = 1; i <= n; i++ ) {
p1[i] = (p1[i-1]*base1)%MOD1;
p2[i] = (p2[i-1]*base2)%MOD2;
h1[i] = (h1[i-1]*base1%MOD1+s[i]-'a'+1)%MOD1;
h2[i] = (h2[i-1]*base2%MOD2+s[i]-'a'+1)%MOD2;
}
}
pair<ll,ll> get( int l, int r ) {
ll x = (h1[r] - h1[l-1]*p1[r-l+1]%MOD1 + MOD1)%MOD1;
ll y = (h2[r] - h2[l-1]*p2[r-l+1]%MOD2 + MOD2)%MOD2;
return {x,y};
}
bool check( int l, int r, int u, int v ) {
pair<ll,ll> x = get(l,r);
pair<ll,ll> y = get(u,v);
return x.first == y.first && x.second == y.second;
}
void solve() {
build_hash();
int i = 0;
int j = 1;
int u = n+1;
int v = n;
while ( i <= n ) {
int x = i+1;
int y = u-1;
if ( j == y && x == v ) {
ans++;
return;
}
if ( check(j,x,y,v) && x <= y ) {
ans += 2;
j = x+1;
v = y-1;
}
i++;
u--;
}
if ( ans == 0 ) ans++;
}
void output() {
cout << ans << endl;
}
void reset() {
ans = 0;
memset(p1,0,sizeof(p1));
memset(p2,0,sizeof(p2));
memset(h1,0,sizeof(h1));
memset(h2,0,sizeof(h2));
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cin >> t;
while ( t-- ) {
input();
solve();
output();
reset();
}
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... |