Cod sursa(job #1552080)

Utilizator tudorcomanTudor Coman tudorcoman Data 17 decembrie 2015 11:09:42
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>
#include <cstring>

const int len = 1e6;
char s[len + 5];
int pi[len + 5];
bool viz[len + 5];

int main() {
  #ifdef INFOARENA
  freopen("prefix.in", "r", stdin);
  freopen("prefix.out", "w", stdout);
  #endif
  
  int T;
  for(scanf("%d\n", &T); T; -- T) {
    gets(s + 1);
    int x = 0, n = strlen(s + 1);
    pi[1] = 0;
    for(int i = 2; i <= n; ++ i) {
      while(x > 0 and s[i] != s[x + 1])
        x = pi[x];
      if(s[i] == s[x + 1])
        ++ x;
      pi[i] = x;
    }
    
    int ans = 0;
    for(int i = 1; i <= n; ++ i) {
      if( (i - pi[i] == pi[i]) || ( i - pi[i] == pi[i] - pi[pi[i]] and viz[pi[i]] ) ) {
        viz[i] = true;
        ans = i;
      } else
        viz[i] = false;
    }
    
    printf("%d\n", ans);
  }
  return 0;
}