Cod sursa(job #2906311)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 25 mai 2022 16:23:31
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pli pair<ll,int>
#define pil pair<int,ll>
#define pll pair<ll,ll>
#define fi first
#define se second
#define inf (INT_MAX/2-1)
#define infl (1LL<<61)
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(a) ((int)(a).size())
#define all(a) begin(a),end(a)
#define y0 y5656
#define y1 y7878
#define aaa system("pause");
#define dbg(x) std::cerr<<(#x)<<": "<<(x)<<'\n',aaa
#define dbga(x,n) std::cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)std::cerr<<x[_]<<' ';std::cerr<<'\n',aaa
#define dbgs(x) std::cerr<<(#x)<<"[stl]: ";for(auto _:x)std::cerr<<_<<' ';std::cerr<<'\n',aaa
#define dbgp(x) std::cerr<<(#x)<<": "<<x.fi<<' '<<x.se<<'\n',aaa
#define dbgsp(x) std::cerr<<(#x)<<"[stl pair]:\n";for(auto _:x)std::cerr<<_.fi<<' '<<_.se<<'\n';aaa
#define maxn 1000000

using namespace std;

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

int lps[maxn+5];

void solver() {
  string s; fin >> s;
  int n = sz(s);
  s = " " + s;

  int i, j;

  lps[0] = lps[1] = 0;
  for (i = 2; i <= n; i++) {
    if (s[lps[i-1]+1] == s[i]) {
      lps[i] = 1 + lps[i-1];
    } else {
      j = i;
      while (j > 0 && s[lps[j-1]+1] != s[i]) {
        j = lps[j-1];
      }

      if (j > 0) {
        lps[i] = lps[j-1] + 1;
      } else {
        lps[i] = 0;
      }
    }
  }

  ///pentru un prefix anume din string, ma folosesc de lps astfel:
  ///[-----==========].....
  ///.....[==========-----]
  ///v[1] = v[lps[x]+1], v[2] = v[lps[x]+2], ...

  ///v[1] = v[lps[x]+1] = v[2*lps[x]+1] = ...; am grupe de repetari, deci dc s[1..x] e format din prefixe,
  ///trebuie doar ca x-lps[x] | x.
  ///vreau si lps[x] * 2 >= x, dar dc lps[x] < x/2, x-lps[x] > x/2 si nu am cum x-lps[x] | x.
  ///(x-lps[x] < x, dc consider doar x pt care lps[x] > 0).

  for (i = n; i >= 1; i--) {
    if (lps[i] > 0 && i % (i-lps[i]) == 0) {
      fout << i << '\n';
      return;
    }
  }

  fout << "0\n";
}

int main () {
  int t; fin >> t;
  while (t--) solver();

  fin.close();
  fout.close();

  return 0;
}