Submission #545927

#TimeUsernameProblemLanguageResultExecution timeMemory
545927rainboyCubeword (CEOI19_cubeword)C11
100 / 100
255 ms10928 KiB
#include <ctype.h>
#include <stdio.h>
#include <string.h>

#define N	100000
#define A	62
#define L	8
#define MD	998244353

unsigned int X = 12345;

int rand_() {
	return (X *= 3) >> 1;
}

char *ss[N * 2];

void sort(char **ss, int l, int r) {
	while (l < r) {
		int i = l, j = l, k = r;
		char *s = ss[l + rand_() % (r - l)], *tmp;

		while (j < k) {
			int c = strcmp(ss[j], s);

			if (c == 0)
				j++;
			else if (c < 0) {
				tmp = ss[i], ss[i] = ss[j], ss[j] = tmp;
				i++, j++;
			} else {
				k--;
				tmp = ss[j], ss[j] = ss[k], ss[k] = tmp;
			}
		}
		sort(ss, l, i);
		l = k;
	}
}

int idx(char c) {
	return isdigit(c) ? c - '0' : (isupper(c) ? c - 'A' + 10 : c - 'a' + 36);
}

int count(int a, int b, int c, int d) {
	if (a == b && b == c && c == d)
		return 1;
	else if (a == b && b == c || b == c && c == d || c == d && d == a || d == a && a == b)
		return 4;
	else if (a == b && c == d || a == c && b == d || a == d && b == c)
		return 6;
	else if (a == b || a == c || a == d || b == c || b == d || c == d)
		return 12;
	else
		return 24;
}

int main() {
	static int kk[L][A][A];
	static long long kk_[A][A][A];
	int n, i, l, a, b, c, d;
	long long ans;

	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		static char s[16], t[16];
		int h;

		scanf("%s", s), l = strlen(s);
		for (h = 0; h < l; h++)
			t[h] = s[l - 1 - h];
		t[l] = 0;
		ss[i << 1 | 0] = strdup(s), ss[i << 1 | 1] = strdup(t);
	}
	sort(ss, 0, n * 2);
	for (i = 0; i < n * 2; i++)
		if (i == 0 || strcmp(ss[i - 1], ss[i]) != 0) {
			l = strlen(ss[i]);
			kk[l - 3][idx(ss[i][0])][idx(ss[i][l - 1])]++;
		}
	ans = 0;
	for (l = 0; l < L; l++) {
		for (a = 0; a < A; a++)
			for (b = a; b < A; b++)
				for (c = b; c < A; c++) {
					long long k;

					k = 0;
					for (d = 0; d < A; d++)
						k += (long long) kk[l][a][d] * kk[l][b][d] * kk[l][c][d];
					kk_[a][b][c] = kk_[a][c][b] = kk_[b][a][c] = kk_[b][c][a] = kk_[c][a][b] = kk_[c][b][a] = k % MD;
				}
		for (a = 0; a < A; a++)
			for (b = a; b < A; b++)
				for (c = b; c < A; c++)
					for (d = c; d < A; d++)
						ans += (long long) kk_[a][b][c] * kk_[b][c][d] % MD * kk_[c][d][a] % MD * kk_[d][a][b] % MD * count(a, b, c, d);
		ans %= MD;
	}
	printf("%lld\n", ans);
	return 0;
}

Compilation message (stderr)

cubeword.c: In function 'count':
cubeword.c:48:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   48 |  else if (a == b && b == c || b == c && c == d || c == d && d == a || d == a && a == b)
      |           ~~~~~~~^~~~~~~~~
cubeword.c:48:58: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   48 |  else if (a == b && b == c || b == c && c == d || c == d && d == a || d == a && a == b)
      |                                                   ~~~~~~~^~~~~~~~~
cubeword.c:48:78: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   48 |  else if (a == b && b == c || b == c && c == d || c == d && d == a || d == a && a == b)
      |                                                                       ~~~~~~~^~~~~~~~~
cubeword.c:50:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   50 |  else if (a == b && c == d || a == c && b == d || a == d && b == c)
      |           ~~~~~~~^~~~~~~~~
cubeword.c:50:58: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   50 |  else if (a == b && c == d || a == c && b == d || a == d && b == c)
      |                                                   ~~~~~~~^~~~~~~~~
cubeword.c: In function 'main':
cubeword.c:64:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |  scanf("%d", &n);
      |  ^~~~~~~~~~~~~~~
cubeword.c:69:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |   scanf("%s", s), l = strlen(s);
      |   ^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...