이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
// Ofast, O0, O1, O2, O3, unroll-loops, fast-math, trapv
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
#define Mp make_pair
#define sep ' '
#define endl '\n'
#define F first
#define S second
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define kill(res) cout << res << '\n', exit(0);
#define set_dec(x) cout << fixed << setprecision(x);
#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io freopen("input.txt", "r", stdin) ; freopen("output.txt", "w", stdout);
const ll S = 11;
const ll C = 65;
const ll N = 1e5 + 50;
const ll Mod = 998244353;
ll n, m, cnt[C][C], val[C][C][C];
vector<string> vec[S];
int id(char x){
if('a' <= x && x <= 'z') return x - 'a';
if('A' <= x && x <= 'Z') return x - 'A' + 26;
return x - '0' + 52;
}
int main(){
fast_io;
cin >> n;
for(int i = 1; i <= n; i++){
string s; cin >> s;
vec[s.size()].pb(s);
reverse(all(s));
vec[s.size()].pb(s);
}
for(int i = 3; i <= 10; i++){
sort(all(vec[i]));
vec[i].resize(unique(all(vec[i])) - vec[i].begin());
}
ll res = 0;
for(int i = 3; i <= 10; i++){
for(int j = 0; j < C; j++) for(int k = 0; k < C; k++) cnt[j][k] = 0;
for(int j = 0; j < C; j++) for(int k = 0; k < C; k++) for(int c = 0; c < C; c++) val[j][k][c] = 0;
for(auto j: vec[i]) cnt[id(j[0])][id(j[i-1])]++;
for(int a = 0; a < C; a++)
for(int b = a; b < C; b++)
for(int c = b; c < C; c++)
for(int j = 0; j < C; j++)
val[a][b][c] = (val[a][b][c] + (cnt[a][j] * cnt[b][j] % Mod * cnt[c][j])) % Mod;
for(int a = 0; a < C; a++)
for(int b = a; b < C; b++)
for(int c = b; c < C; c++)
for(int d = c; d < C; d++){
ll th = val[a][b][c] * val[a][b][d] % Mod * val[a][c][d] % Mod * val[b][c][d] % Mod;
ll z = 24;
vector<int> ops;
ops.pb(a); ops.pb(b); ops.pb(c); ops.pb(d);
ops.resize(unique(all(ops)) - ops.begin());
if(ops.size() == 1) z = 1;
if(ops.size() == 2){
z = 4;
if(a == b && c == d) z = 6;
}
if(ops.size() == 3) z = 12;
res = (res + th * z) % Mod;
}
}
cout << res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |