Cod sursa(job #2259733)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 13 octombrie 2018 18:16:40
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fi("prefix.in");
ofstream fo("prefix.out");

string s;
int pi[1000001];
bool periodic[1000001];//periodic[i] = este periodic prefixul de lungime i?

inline int get_pi(char ch, int i){
  i = pi[i];
  while(i != -1 && ch != s[i])
    i = pi[i];
  return i;
}

int main()
{
  int n, ans;
  fi >> n;
  getline(fi, s);
  for(int t = 0; t < n; t++){
    getline(fi, s);
    pi[0] = -1;
    for(int i = 0; i < s.size(); i++)
      pi[i + 1] = get_pi(s[i], i) + 1;
    ans = 0;
    for(int i = 1; i <= s.size(); i++)
      if(pi[i] != 0 && ((periodic[pi[i]] && i - pi[i] == pi[i] - pi[pi[i]]) || i == 2 * pi[i])){
        periodic[i] = true;
        ans = i;
      }
      else
        periodic[i] = false;
    fo << ans << '\n';
  }
  fi.close();
  fo.close();
  return 0;
}