| 比赛 |
NOIP2025模拟赛2 |
评测结果 |
AAAAAAAAAAAAAAAA |
| 题目名称 |
回文块 |
最终得分 |
100 |
| 用户昵称 |
wdsjl |
运行时间 |
0.647 s |
| 代码语言 |
C++ |
内存使用 |
43.74 MiB |
| 提交时间 |
2025-11-25 10:35:38 |
显示代码纯文本
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int M = 13331;
const int N = 5e6 + 10;
ull has[N];
ull pw[N];
int T, len;
char s[N];
void pre() {
pw[0] = 1;
for (int i = 1; i < N; i++) {
pw[i] = pw[i - 1] * M;
}
}
ull calc(int l, int r) {
return has[r] - has[l - 1] * pw[r - l + 1];
}
int main() {
freopen("palin.in","r",stdin);
freopen("palin.out","w",stdout);
pre();
ios::sync_with_stdio(false);
cin.tie(0);
cin >> T;
while (T--) {
cin >> (s + 1);
len = strlen(s + 1);
has[0] = 0;
for (int i = 1; i <= len; i++) {
has[i] = has[i - 1] * M + s[i];
}
int l = 1;
int r = len;
int cnt = 0;
while (l <= r) {
bool iok = false;
int mps = (r - l + 1) / 2;
for (int k = 1; k <= mps; k++) {
ull hash_left = calc(l, l + k - 1);
ull hash_right = calc(r - k + 1, r);
if (hash_left == hash_right) {
cnt += 2;
l += k;
r -= k;
iok = true;
break;
}
}
if (!iok) {
cnt += 1;
break;
}
}
cout << cnt << '\n';
}
return 0;
}