T了很多次居然卡strlen,strlen是O(n)复杂度的,所以说以后不要经常用了。。。。。。
#include <cstdio>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <utility>
#include <stack>
#include <functional>
#define _min(x, y) ((x)<(y)?(x):(y))
using namespace std;
typedef long long lovelive;
const int inf = INT_MAX;
const double pai = acos(-1.0);
const double gold = (sqrt(5.0) - 1.0) / 2.0;
char base_arr[1000117], use_arr[2000117];
int rec_arr[2000117];
int n, len;
void init()
{
int i, j, k;
memset(base_arr, 0, sizeof(base_arr));
memset(use_arr, 0, sizeof(use_arr));
memset(rec_arr, 0, sizeof(rec_arr));
return ;
}
void input_data()
{
int i, j, k;
scanf("%s", base_arr);
j = 0;
len = strlen(base_arr);
use_arr[j] = '#';
for(i = 0; i < strlen(base_arr); ++i)
{
use_arr[j++] = '#';
use_arr[j++] = base_arr[i];
// use_arr[2 * i + 1] = base_arr[i];
// use_arr[2 * i + 2] = '#';
}
use_arr[j] = '#';
return ;
}
void solve()
{
int i, j, k;
len = len * 2 + 1;
int id, mx = 0;
for(i = 0; i < len; ++i)
{
if(mx > i)
{
rec_arr[i] = _min(rec_arr[id * 2 - i], rec_arr[id] + id - i);
}
else
{
rec_arr[i] = 1;
}
while(use_arr[i - rec_arr[i]] == use_arr[i + rec_arr[i]] && i - rec_arr[i] >= 0 && i + rec_arr[i] < len)
{
rec_arr[i] += 1;
}
if(rec_arr[i] + i > mx)
{
id = i;
mx = rec_arr[i] + i;
}
}
return ;
}
void output_data()
{
int i, j, k;
k = 1;
for(i = 0; i < len; ++i)
{
if(rec_arr[i] > k) k = rec_arr[i];
}
printf("%d\n", k - 1);
return ;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
// freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
#endif // ONLINE_JUDGE
int i, j, k;
while(scanf("%d", &n) != EOF)
{
while(n--)
{
init();
input_data();
solve();
output_data();
}
}
return 0;
}