Cod sursa(job #2921907)

Utilizator mihneazzzMacovei Daniel mihneazzz Data 2 septembrie 2022 13:10:48
Problema Prefix Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>

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

vector<int> prefix_function(string s) {
    int n = s.size();
    vector<int> pi(n);
    for (int i = 1; i < n; i++) {
        int j = pi[i-1];
        while (j > 0 && s[i] != s[j])
            j = pi[j-1];
        if (s[i] == s[j])
            j++;
        pi[i] = j;
    }
    return pi;
}
vector<int> z_function(string s) {
    int n = (int) s.length();
    vector<int> z(n);
    for (int i = 1, l = 0, r = 0; i < n; ++i) {
        if (i <= r)
            z[i] = min (r - i + 1, z[i - l]);
        while (i + z[i] < n && s[z[i]] == s[i + z[i]])
            ++z[i];
        if (i + z[i] - 1 > r)
            l = i, r = i + z[i] - 1;
    }
    return z;
}

int main()
{
    int t;string s;//char s[1000005];
    fin>>t;
    while(t--)
    {
        fin>>s;
        int n=s.size(),ans=0;
        vector<int>z=z_function(s);
        //for(int i=0;i<n;i++) cout<<pi[i]<<" ";cout<<"\n";
        //for(int i=0;i<n;i++) cout<<z[i]<<" ";cout<<"\n";
        for(int i=1;i<=n;i++)
          ///  if(z[i-1]&&i%(i-z[i-1])==0) ans=i;
          if(z[i-1]&&(i+z[i-1]-1)%(i-1)==0) ans=max(ans,i+z[i-1]-1);
        fout<<ans<<"\n";
    }
    return 0;
}