Submission #241632

#TimeUsernameProblemLanguageResultExecution timeMemory
241632luciocfCubeword (CEOI19_cubeword)C++14
100 / 100
530 ms22392 KiB
// CEOI 2019 - Cubeword
// Lúcio Cardoso

// Solution is the same as in editorial in CF

#include <bits/stdc++.h>

#pragma GCC target ("avx2")
#pragma GCC optimize ("O3")
#pragma GCC optimization ("unroll-loops")

using namespace std;

const int maxn = 62;
const int mod = 998244353;

int cnt[8][maxn][maxn];
int qtd[8][maxn][maxn][maxn];

inline int get(char c)
{
	if (c >= 'a' && c <= 'z') return (int)(c-'a');
	if (c >= 'A' && c <= 'Z') return (int)(c-'A')+26;
	return (int)(c-'0')+52;
}

int main(void)
{
	int n;
	scanf("%d", &n);

	map<string, bool> mark;

	for (int i = 1; i <= n; i++)
	{
		string s;
		cin >> s;

		if (!mark[s])
			cnt[s.size()-3][get(s[0])][get(s.back())]++;

		mark[s] = true;

		reverse(s.begin(), s.end());

		if (!mark[s])
			cnt[s.size()-3][get(s[0])][get(s.back())]++;

		mark[s] = true;
	}

	for (int sz = 0; sz < 8; sz++)
		for (int a = 0; a < 62; a++)
			for (int b = a; b < 62; b++)
				for (int c = b; c < 62; c++)
					for (int d = 0; d < 62; d++)
						qtd[sz][a][b][c] = (1ll*qtd[sz][a][b][c] + 1ll*cnt[sz][d][a]*cnt[sz][d][b]*cnt[sz][d][c])%mod;

	int ans = 0;

	for (int sz = 0; sz < 8; sz++)
	{
		for (int a = 0; a < 62; a++)
		{
			for (int b = a; b < 62; b++)
			{
				for (int c = b; c < 62; c++)
				{
					for (int d = c; d < 62; d++)
					{
						int p1 = (1ll*qtd[sz][a][c][d]*qtd[sz][b][c][d])%mod;
						int p2 = (1ll*qtd[sz][a][b][d]*qtd[sz][a][b][c])%mod;

						int k = (1ll*p1*p2)%mod, mult = 24;

						if (a == b && b == c && c == d) mult /= 24;
						else if (a == b && b == c) mult /= 6;
						else if (a == b)
						{
							mult /= 2;
							if (c == d) mult /= 2;
						}
						else
						{
							if (b == c && c == d) mult /= 6;
							else if (b == c) mult /= 2;
							else if (c == d) mult /= 2;
						}

						ans = (ans + (1ll*mult*k)%mod)%mod;
					}
				}
			}
		}
	}

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

Compilation message (stderr)

cubeword.cpp:10:0: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
 #pragma GCC optimization ("unroll-loops")
 
cubeword.cpp: In function 'int main()':
cubeword.cpp:30:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...