Cod sursa(job #1090163)

Utilizator cruelifanLouis Cypher cruelifan Data 22 ianuarie 2014 13:33:13
Problema Prefix Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.75 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int knmax = 105;

bool dp[knmax];
int t[knmax];
char sr[knmax];

int pref(char *v){
  int ans = 0, p;
  memset(t, 0, sizeof(t));
  memset(dp, 0, sizeof(dp));
  int sz = strlen(v + 1);
  for(int i = 2; i <= sz; ++i){
    p = i - 1;
    do{
      p = t[p];
      if(v[i] == v[p + 1]){
        t[i] = p + 1;
        break;
      }
    }while(p);
    if(!(i & 1))
      if(t[i] == i / 2)
        dp[i] = 1;
    if(dp[t[i]] && t[i] > i / 2)
      dp[i] = 1;
    if(dp[i])
      ans = i;
  }
  return ans;
}

int main(){
  freopen("prefix.in", "r", stdin);
  freopen("prefix.out", "w", stdout);

  int ts;
  scanf("%d\n", &ts);
  while(ts --){
    gets(sr + 1);
    printf("%d\n", pref(sr));
  }

  return 0;
}