Cod sursa(job #3151669)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 22 septembrie 2023 13:28:38
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#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;
}