Submission #1194909

#TimeUsernameProblemLanguageResultExecution timeMemory
1194909irmuunCubeword (CEOI19_cubeword)C++20
50 / 100
255 ms3588 KiB
#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=16; 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...