Cod sursa(job #2445932)

Utilizator Iulia25Hosu Iulia Iulia25 Data 6 august 2019 10:49:34
Problema Prefix Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstring>
#include <fstream>
#include <iostream>

using namespace std;

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

const int MAXN =1e6 + 5;
int Z[MAXN],n,t, last[2005];
char T[MAXN];


void getZarr( ) {
	int L, R, k;

	L = R = 0;
	for (int i = 1; i < n; ++i) {
		if (i > R) {
			L = R = i;

			while (R<n && T[R-L] == T[R])
				R++;
			Z[i] = R-L;
			R--;
		} else {
			k = i-L;
			if (Z[k] < R-i+1)
				Z[i] = Z[k];

			else {
				L = i;
				while (R<n && T[R-L] == T[R])
					R++;
				Z[i] = R-L;
				R--;
			}
		}
	}
}
int main() {

	fin >> t;
	for ( ; t > 0; --t) {
		fin >> (T);
		n = strlen(T);
		getZarr();
		int  ma = 0;
		for ( int i = 0; i < n; ++i) {
			if ( Z[i] >= i)
				ma = max(ma,2*i);
		}
		for (int i = 0; i <= 2000; ++i)
      last[i] = -1;
    int Max = 0;
    for (int i = 0; i < ma; ++i)  {
      if (last[T[i]] != -1)  {
        if (Max < i - last[T[i]])
          Max = i - last[T[i]];
      }
      last[T[i]] = i;
    }
    if (ma + Max <= n)  {
      bool ok = true;
      for (int i = 0; i < Max; ++i)
        if (T[i] != T[i + ma]) {
          ok = false;
          break;
        }
      if (ok)
        ma += Max;
    }
		fout << ma << "\n";
	}
}