CF上报了这个错,但是我打死都想不到怎么错的。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e6 + 5;
const int MOD = 998244353;
int inpt()
{
int x = 0, f = 1;
char ch;
for(ch = getchar(); (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-'){
f = -1;
ch = getchar();
}
do{
x = (x << 3) + (x << 1) + ch - '0';
ch = getchar();
}while(ch >= '0' && ch <= '9');
return f * x;
}
int n;
string str;
int ans = 0;
char ch[MAXN << 1];
int cnt = 0;
void init(int l, int r)
{
cnt = 0;
ch[0] = '&';
while(l <= r) {
ch[++cnt] = '#';
ch[++cnt] = str[l++];
}
ch[++cnt] = '#';
ch[++cnt] = '@';
}
int p[MAXN << 1];
bool opt = 0;
int pos = 0;
int doit()
{
int val = 0;
for(int i = 0; i <= cnt; i++)
p[i] = 1;
int mid = 0, r = 0;
for(int i = 0; i <= cnt; i++) {
if(i + p[(mid << 1) - i] > r)
p[i] = r - i;
else
p[i] = p[(mid << 1) - i];
while(ch[i - p[i]] == ch[i + p[i]])
p[i]++;
if(i + p[i] > r) {
mid = i;
r = i + p[i];
}
if(i - p[i] == 0 && p[i] - 1 >= val) {
val = p[i] - 1;
opt = 0;
}
if(i + p[i] == cnt && p[i] - 1 >= val) {
val = p[i] - 1;
opt = 1;
}
}
return val;
}
int main()
{
n = inpt();
while(n--) {
cin >> str;
int len = str.size();
ans = 0;
if(len == 1) {
printf("%c\n", str[0]);
continue;
}
int l = 0, r = len - 1;
for(; l < ((len + 1) >> 1); l++, r--)
if(str[l] != str[r]) {
l--, r++;
break;
}
if(r - l > 1) {
init(l + 1, r - 1);
pos = doit();
}else {
pos = 0;
}
for(int i = 0; i <= l; i++)
printf("%c", str[i]);
if(!opt) {
for(int i = l + 1, j = 1; j <= pos; i++, j++)
printf("%c", str[i]);
}else {
for(int i = r - pos, j = 1; j <= pos; i++, j++)
printf("%c", str[i]);
}
for(int i = max(r, l + 1); i < len; i++)
printf("%c", str[i]);
puts("");
}
return 0;
}
/*
1
ywowyovhrgradhtrqkgurkjpudnrrqhmmwiaqicfxnoyejdsmmurusdzqgjjntocryhqsgr
1
abcdqzba
*/