Cod sursa(job #2902225)

Utilizator LuciBBadea Lucian LuciB Data 15 mai 2022 21:49:10
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

const int NMAX = 2e6;

int z[2 * NMAX + 1];

string s;

void zAlgorithm() {
    int l, r;
    l = r = 0;
    for(int i = 0; i < s.size(); i++)
        z[i] = 0;
    for(int i = 1; i < s.size(); i++) {
        if(i > r) {
            l = r = i;
            while(r < s.size() && s[r - l] == s[r])
                r++;
            r--;
            z[i] = r - l + 1;
        } else if(z[i - l] < r - i + 1) {
            z[i] = z[i - l];
        } else {
            l = i;
            while(r < s.size() && s[r - l] == s[r])
                r++;
            r--;
            z[i] = r - l + 1;
        }
    }
}
string a, b;
ifstream fin("prefix.in");
ofstream fout("prefix.out");
int ans[NMAX];
int main() {
    int t;
    fin >> t;
    while(t--) {
        fin >> a;// >> b;
        s = a;
        zAlgorithm();
        int maxx = 0;
        for(int i = 1; i < s.size(); i++) {
            if(z[i] >= i) {
                maxx = max(maxx, (z[i] - z[i] % i) + i);
            }
        }
        fout << maxx << endl;
    }
    /*int x = 0;
    for(int i = 1; i < s.size(); i++) {
        if(z[i] == a.size()) {
            ans[x++] = i - (int)a.size() - 1;
        }
    }
    fout << x << endl;
    for(int i = 0; i < min(x, 1000); i++)
        fout << ans[i] << ' ';
    fin.close();
    fout.close();*/
    fin.close();
    fout.close();
    return 0;
}