Pagini recente » Infoarena Monthly 2014 - Clasament | Cod sursa (job #53798) | Cod sursa (job #268582) | Cod sursa (job #1804799) | Cod sursa (job #3151669)
#include <fstream>
#include <vector>
#include <cstring>
#define pb push_back
using namespace std;
ifstream cin("prefix.in");
ofstream cout("prefix.out");
const int nmax = 1e6 + 3;
int dp[nmax] , lps[nmax];
string a;
void solve()
{
memset(dp,0,sizeof(dp));
memset(lps,0,sizeof(lps));
cin >> a;
int sza = a.size();
for(int i = 0 , j = 1; j < sza ;)
{
if(a[i]==a[j])
{
lps[j] = i+1;
i++; j++;
}
else
{
if(i) i = lps[i-1];
else j++;
}
}
int pmax = 0;
for(int i = 1 ; i < sza ; i++)
{
int pr = lps[i]-1;
if(pr<0) continue;
if(dp[pr])
{
if(dp[pr]==i-pr)
{
dp[i] = dp[pr];
}
}
else
{
if(i&1)
{
if(pr+1==(i+1)/2)
{
dp[i] = pr+1;
}
}
}
if(dp[i]) pmax = i+1;
}
cout << pmax << '\n';
}
signed main()
{
int T;
cin >> T;
while(T--) solve();
return 0;
}