#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()
const int mod=998244353;
void mul(int &a,int b){
a=1ll*a*b%mod;
}
void add(int &a,int b){
a+=b;
if(a>=mod) a-=mod;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int lim=52;
int pos[256];
for(int i=0;i<26;i++){
pos['a'+i]=i;
}
for(int i=0;i<26;i++){
pos['A'+i]=i+26;
}
for(int i=0;i<10;i++){
pos['0'+i]=i+52;
}
int n;
cin>>n;
string s[n+5];
auto cnt=vector(11,vector(lim,vector(lim,0)));
for(int i=1;i<=n;i++){
cin>>s[i];
string t=s[i];
reverse(all(t));
if(t<s[i]) s[i]=t;
}
sort(s+1,s+n+1);
for(int i=1;i<=n;i++){
if(i>1&&s[i]==s[i-1]) continue;
int x=pos[s[i][0]],y=pos[s[i].back()];
cnt[s[i].size()][min(x,y)][max(x,y)]++;
if(s[i][0]==s[i].back()){
string t=s[i];
reverse(all(t));
if(s[i]!=t){
cnt[s[i].size()][min(x,y)][max(x,y)]++;
}
}
}
int p=1;
for(int a=3;a<=10;a++){
for(int i=0;i<lim;i++){
for(int j=i+1;j<lim;j++){
cnt[a][j][i]=cnt[a][i][j];
}
}
}
for(int i=0;i<4;i++){
p*=lim;
}
int ans=0;
vector<int>adj[8];
for(int i=0;i<4;i++){
adj[i].pb(i+4);
adj[i+4].pb(i);
adj[i].pb((i+1)%4);
adj[(i+1)%4].pb(i);
adj[i+4].pb((i+1)%4+4);
adj[(i+1)%4+4].pb(i+4);
}
vector<int>v[2];
v[0]={0,2,5,7};
v[1]={1,3,4,6};
for(int a=3;a<=10;a++){
for(int i=0;i<p;i++){
int cur=1,c[8];
int x=i;
for(int j:v[0]){
c[j]=x%lim;
x/=lim;
}
int all=1;
for(int x:v[1]){
int sum=0;
for(int d=0;d<lim;d++){
int tot=1;
for(int y:adj[x]){
mul(tot,cnt[a][c[y]][d]);
}
add(sum,tot);
}
mul(all,sum);
}
add(ans,all);
}
}
cout<<ans;
}
# | 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... |