Submission #1303019

#TimeUsernameProblemLanguageResultExecution timeMemory
1303019Faisal_SaqibCubeword (CEOI19_cubeword)C++20
50 / 100
998 ms100656 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define int long long const int N=257,mod=998244353; const char LCH='p'; vector<int> ma[N],pth,rma[N]; char val[N]; set<string> cnt1[20][300][300]; ll cnt[20][300][300]; ll dp[N][N]; bool gonxt() // fix only 4 value { val[0]='a'; val[4]++; for(int i=4;i>=1;i--) { if(val[i]>LCH) { val[i]='a'; val[i-1]++; } } if(val[0]=='b') { return 0; } return 1; } ll count(int len) { // cout<<"AT "; // for(int i=1;i<=8;i++)cout<<val[i]<<' '; // cout<<endl; ll ans=1; for(int i=1;i<=1;i++) { for(auto j:ma[i]) { ans*=((ll)(cnt[len][val[i]][val[j]]))%mod; ans=(ans%mod); } } for(int i=5;i<=7;i++) { for(char c='a';c<=LCH;c++) { dp[i][c]=1; for(auto j:rma[i]) { dp[i][c]=(dp[i][c]*(ll)(cnt[len][c][val[j]]))%mod; } } } ll fnl=0; for(int i=8;i<=8;i++) { for(char c='a';c<=LCH;c++) { dp[i][c]=1; ll sm=0,sm1=0,sm2=0; for(char c1='a';c1<=LCH;c1++) { sm=(sm+(dp[5][c1]*(ll)(cnt[len][c][c1]))%mod)%mod; sm1=(sm1+(dp[6][c1]*(ll)(cnt[len][c][c1]))%mod)%mod; sm2=(sm2+(dp[7][c1]*(ll)(cnt[len][c][c1]))%mod)%mod; } dp[i][c]=(dp[i][c]*sm)%mod; dp[i][c]=(dp[i][c]*sm1)%mod; dp[i][c]=(dp[i][c]*sm2)%mod; fnl+=(dp[i][c]*ans)%mod; fnl%=mod; } } return fnl; } int32_t main() { // cout<<('p'-'a'+1)<<endl; ma[1].push_back(2); // 1 2 ma[1].push_back(3);// 1 3 ma[1].push_back(4);// 1 5 ma[2].push_back(5);// 2 4 ma[2].push_back(6);// 2 6 ma[3].push_back(5); // 3 4 ma[3].push_back(7);// 3 7 ma[5].push_back(8);// 4 8 ma[4].push_back(6); // 5 6 ma[4].push_back(7); // 5 7 ma[6].push_back(8); // 6 8 ma[7].push_back(8); // 7 8 // dfs(1); for(int i=1;i<=8;i++) { for(auto j:ma[i]) { // cout<<i<<' '<<j<<endl; rma[j].push_back(i); } } int n; cin>>n; for(int i=0;i<n;i++) { string s; cin>>s; int len=s.size(); string t=s; reverse(begin(t),end(t)); cnt1[len][s[0]][s.back()].insert(s); if(t==s)continue; cnt1[len][s.back()][s[0]].insert(t); } for(int l=3;l<=10;l++) { for(char a='a';a<=LCH;a++) { for(char b='a';b<=LCH;b++) { cnt[l][a][b]=cnt1[l][a][b].size(); } } } ll sm=0; for(int x=1;x<=8;x++)val[x]='?'; for(int len=3;len<=10;len++) { for(int x=1;x<=4;x++) { val[x]='a'; } do { sm+=count(len)%mod; sm%=mod; // break; }while(gonxt()); } cout<<sm<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...