Cod sursa(job #2699333)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 24 ianuarie 2021 11:16:50
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#include <bitset>
#include <queue>

#define maxn 100005
#define maxv 1005
#define mod 998244353LL

// #define fin std::cin
// #define fout std::cout

std::ifstream fin("prefix.in");
std::ofstream fout("prefix.out");



int32_t main(){

    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    std::cout.tie(NULL);

    int Q;
    fin >> Q;
    while(Q --){
        std::string s;
        fin >> s;
        int lp[s.size()] = {};
        lp[0] = 0;
        for(int i=1, k=0; i<s.size(); i++){
            while(k > 0 and s[k] != s[i])
                k = lp[k-1];
            if(s[i] == s[k])
                k ++;
            lp[i] = k;
        }

        // for(int i=0; i<s.size(); i++)
        //     fout << lp[i] << ' ';
        // fout << '\n';


        bool foundSol = false;
        for(int i=s.size()-1; i>=0 and foundSol == false; i--){
            if(2*lp[i] == (i+1)){
                fout << i+1 << '\n';
                foundSol = true;
            }
            else if(2*lp[i] < i+1)
                continue;
            else{
                int pref = (i+1) - lp[i];
                if((2*lp[i] - i - 1) % pref == 0){
                    fout << i+1 << '\n';
                    foundSol = true;
                }
            }
        }
        if(foundSol == false)
            fout << "0\n";
    }
        


    return 0;
}