Submission #22289

#TimeUsernameProblemLanguageResultExecution timeMemory
22289↓우리보다잘하는팀 (#40)Joyful KMP (KRIII5_JK)C++14
7 / 7
99 ms17716 KiB
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const long long INF = 91e17;

char a[1000001];
int f[1000001];
int c[1000001];
int v[26];
long long d[1000001];

int main() {
	long long m;
	int i, j, k, l, n, r;
	scanf("%s%lld", a, &m);
	n = strlen(a);
	f[i = 0] = j = -1;
	while (i < n) {
		if (j == -1) {
			for (k = 0; k < 26; k++) {
				if (!v[k]) c[i]++;
				v[k] = 0;
			}
			f[++i] = ++j;
		}
		else if (a[i] == a[j]) {
			for (k = 0; k < 26; k++) v[k] = 0;
			c[i] = 1;
			f[++i] = ++j;
		}
		else {
			v[a[j] - 97] = 1;
			j = f[j];
		}
	}
	d[n] = r = 1;
	for (i = n - 1; i >= 0; i--) {
		r = 1ll * r * c[i] % 1000000007;
		d[i] = 1. * d[i + 1] * c[i] > INF ? INF : d[i + 1] * c[i];
	}
	printf("%d\n", r);
	if (d[0] < m) {
		puts("OVER");
		return 0;
	}
	m--;
	j = -1;
	for (i = 0; i < n; i++) {
		for (k = 0; k < 26; k++) v[k] = 0;
		while (f[i + 1] != j + 1) {
			v[a[j] - 97] = 1;
			j = f[j];
		}
		if (j != -1) k = a[j] - 97;
		else {
			l = m / d[i + 1];
			m %= d[i + 1];
			for (k = 0; k < 26; k++) {
				if (!v[k]) {
					if (!l) break;
					l--;
				}
			}
		}
		putchar(a[i] = k + 97);
		j++;
	}
}

Compilation message (stderr)

JK.cpp: In function 'int main()':
JK.cpp:18:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s%lld", a, &m);
                        ^
#Verdict Execution timeMemoryGrader output
Fetching results...