Submission #1303116

#TimeUsernameProblemLanguageResultExecution timeMemory
1303116Jawad_Akbar_JJCubeword (CEOI19_cubeword)C++20
100 / 100
418 ms10528 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
#define int long long
int dp[100][100][100], cnt[100][100], cur, n, Ans1, Ans2, id[1000], mod = 998244353;
vector<string> vec[50];

signed main(){
	cin>>n;

	for (int i=1;i<=n;i++){
		string s;
		cin>>s;
		int k = s.size();
		vec[k].push_back(s);
		reverse(begin(s), end(s));
		vec[k].push_back(s);

		for (char c : s)
			if (id[c] == 0)
				id[c] = ++cur;
	}

	for (int i=3;i<=10;i++){
		sort(begin(vec[i]), end(vec[i]));
		vec[i].resize(unique(begin(vec[i]), end(vec[i])) - begin(vec[i]));


		for (string s : vec[i])
			cnt[id[s[0]]][id[s[i-1]]]++;

		for (int i=1;i<=cur;i++){
			for (int j=1;j<=cur;j++){
				for (int k=1;k<=cur;k++){
					dp[i][j][k] = 0;
					for (int l=1;l<=cur;l++)
						dp[i][j][k] += cnt[i][l] * cnt[l][j] * cnt[l][k];
					dp[i][j][k] %= mod;
				}
			}
		}


		for (int i=1;i<=cur;i++){
			for (int j=i+1;j<=cur;j++){
				int Ans3 = 0, Ans4 = 0;
				for (int k=1;k<=cur;k++){
					for (int l=k+1;l<=cur;l++)
						Ans3 =  (Ans3 + dp[i][j][k] * dp[i][j][l] % mod * dp[i][k][l] % mod * dp[j][k][l]) % mod;
					Ans4 =  (Ans4 + dp[i][j][k] * dp[i][j][k] % mod * dp[i][k][k] % mod * dp[j][k][k]) % mod;
				}
				Ans1 += Ans3 * 2 + Ans4;
			}

			for (int k=1;k<=cur;k++)
				for (int l=1;l<=cur;l++)
					Ans2 =  (Ans2 + dp[i][i][k] * dp[i][i][l] % mod * dp[i][k][l] % mod * dp[i][k][l]) % mod; 
		}
		
		for (string s : vec[i])
			cnt[id[s[0]]][id[s[i-1]]]--;
	}

	cout<<(Ans1 * 2 + Ans2) % mod<<'\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...