Cod sursa(job #2446101)

Utilizator Iulia25Hosu Iulia Iulia25 Data 7 august 2019 09:46:41
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <cstring>
#include <fstream>
#include <iostream>
#include <cmath>

using namespace std;

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

const int MAXN =1e6 + 5;
int Z[MAXN],n,t, last[2005], dif[27], ma;
char T[MAXN];
bool exista[27];

int CMMDC(int x, int y)  {
  int r = x % y;
  while (r)  {
    x = y;
    y = r;
    r = x % y;
  }
  return y;
}

bool ok(int Max)  {
  for (int i = 0; i < Max; ++i)  {
    for (int j = Max; j <= ma; j += Max)  {
      if (T[i] != T[i + j])
        return false;
    }
  }
  return true;
}

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();
		ma = 0;
		for ( int i = 0; i < n; ++i) {
			if ( Z[i] >= i)
				ma = max(ma,2*i);
		}
    int cmmdc;
    for (int i = 0; i < 26; ++i)
      dif[i] = 0;
		for (int i = 0; i < ma; ++i)  {
			++dif[T[i] - 'a'];
			cmmdc = dif[T[i] - 'a'];
    }
    for (int i = 0; i < 26; ++i)  {
      if (dif[i])  {
        cmmdc = CMMDC(cmmdc, dif[i]);
      }
    }
    int start = sqrt(cmmdc);
    bool OK = false;
    for (int i = start; i; --i)  {
      if (cmmdc % i == 0)  {
        int l = ma / (cmmdc / i);
        if (ok(l))  {
          ma += l;
          OK = true;
          break;
        }
      }
    }
    if (!OK)  {
      for (int i = start; i; --i)  {
        if (cmmdc % i == 0)  {
          int l = ma / i;
          if (ok(l))  {
            ma += l;
            break;
          }
        }
      }
    }
		fout << ma << "\n";
	}
}