PKU 2406 Power Strings

  • 最初に考えたときはナイーブな方法だと計算量が足りないなぁと延々と考えていた
  • 繰り返される文字数kを全部回すとO(N^2)で通らない
  • Nの約数の個数はO(log(N))個なので、Nの約数kだけ見ればO(N\log(N))となり通る
static char input[2 * 1024 * 1024];

int main() {
	while (scanf("%s", input), strcmp(input, ".") != 0) {
		const int n = strlen(input);
		int answer = -1;
		for (int length = 1; length <= n; ++length) {
			if (n % length != 0) {
				continue;
			}

			bool ok = true;
			for (int i = length; ok && i < n; ++i) {
				ok = (input[i % length] == input[i]);
			}

			if (ok) {
				answer = n / length;
				break;
			}
		}

		printf("%d\n", answer);
	}
}