Submission #1233232

#TimeUsernameProblemLanguageResultExecution timeMemory
1233232djsksbrbfCubeword (CEOI19_cubeword)C++20
0 / 100
1029 ms9348 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
#define pb push_back
#define fi first
#define se second
const int MAX = 2e5 + 5;
const int MOD = 1e9 + 7;

int swit(char c){
	if('a' <= c && c <= 'z')return (c - 'a' + 1);
	else if('A' <= c && c <= 'Z')return (c - 'A' + 27);
	return (c - '0' + 53);
}

ll ad(ll x, ll y){
	x %= MOD;
	y %= MOD;
	
	return (x + y) % MOD;
}

ll mul(ll x, ll y){
	x %= MOD;
	y %= MOD;
	
	return (x *y) % MOD;
}

ll sub(ll a, ll b){
	a %= MOD;
	b %= MOD;
	
	return (a - b + MOD) % MOD;
}

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

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	int n; cin >> n;
	vector <string> v[11];
	
	for(int i  =0 ; i < n ; i++){
		string s; cin >> s;
		v[(int)s.size()].pb(s);
	}
	
	ll ans = 0;
	for(int len = 3 ; len <= 10 ; len++){
		set <string> can;
		ll cnt[70][70];memset(cnt, 0, sizeof(cnt));
		
		for(auto it : v[len]){
			can.insert(it);
			reverse(it.begin(), it.end());
			can.insert(it);
		}
		
		for(auto it : can)cnt[swit(it[0])][swit(it.back())]++;
		
		ll dp[70][70][70];memset(dp, 0, sizeof(dp));
		for(int i = 1 ; i <= 62 ; i++){
			for(int j = 1 ; j <= 62 ; j++){
				for(int k = 1 ; k <= 62 ; k++){
					for(int l = 1 ; l <= 62 ; l++){
						ll t = mul(cnt[i][l], mul(cnt[j][l], cnt[k][l]));
						dp[i][j][k] = ad(dp[i][j][k], t);
					}
				}
			}
		}
		
		ll tm = 0;
		for(int i = 1 ; i <= 62 ; i++){
			for(int j = i ; j <= 62 ; j++){
				for(int k = j ; k <= 62 ; k++){
					for(int l = k ; l <= 62 ; l++){
						ll tmp = mul(dp[i][j][k], mul(dp[i][j][l], mul(dp[i][k][l], dp[j][k][l])));
						
						tmp = mul(tmp, chek(i, j, k, l));
						tm = ad(tm, tmp);
					}
				}
			}
		}
		
		ans = ad(ans, tm);
	}
	cout << ans << endl;
	
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...