#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 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... |