Cod sursa(job #3242905)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 14 septembrie 2024 16:14:04
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 2e6 + 5;
string s;
int pi[N]; // cel mai lung sufix propriu egal cu un prefix
void kmp(string &s, int *pi) {
    int k = 0;
    for(int i = 1; i < s.length(); i++) {
        while(k > 0 && s[i] != s[k]) {
            k = pi[k - 1];
        }
        if(s[i] == s[k]) {
            k++;
        }
        pi[i] = k;
    }
}

int z[2 * N];
void Z(string &s, int *z) {
    int l = 0, r = 0; // [l, r)
    int n = s.length();
    for(int i = 1; i < n; i++) {
        z[i] = 0;
        if(i < r) {
            z[i] = min(z[i - l], r - i);
        }
        while(i + z[i] < n && s[i + z[i]] == s[z[i]]) {
            z[i]++;
        }
        if(i + z[i] > r) {
            l = i;
            r = i + z[i];
        }
    }
}

// #define HOME

int main() {
#ifndef HOME
    ifstream cin("prefix.in");
    ofstream cout("prefix.out");
#endif
    int n;
    string s;
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> s;
        kmp(s, pi);
        int n = s.length();
        int res = 0;
        for(int i = 1; i <= n; i++) {
            if(pi[i - 1] > 0 && i % (i - pi[i - 1]) == 0)
                res = i;
        }
        cout << res << "\n";
    }
    return 0;
}