Submission #1303017

#TimeUsernameProblemLanguageResultExecution timeMemory
1303017Faisal_SaqibCubeword (CEOI19_cubeword)C++20
0 / 100
1199 ms99440 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int N=257,mod=998244353;
vector<int> ma[N],pth,rma[N];
char val[N];
set<string> cnt[20][300][300];
ll dp[N][N];
void dfs(int x)
{
  pth.push_back(x);
  for(auto y:pth)cout<<y<<' ';
  cout<<endl;
  for(auto y:ma[x])
  {
    dfs(y);
  }
  pth.pop_back();
}
bool gonxt() // fix only 4 value
{
  val[0]='a';
  val[4]++;
  for(int i=4;i>=1;i--)
  {
    if(val[i]>'p')
    {
      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]].size()))%mod;
      ans=(ans%mod);
    }
  }
  for(int i=5;i<=7;i++)
  {
    for(char c='a';c<='p';c++)
    {
      dp[i][c]=1;
      for(auto j:rma[i])
      {
        dp[i][c]=(dp[i][c]*(ll)(cnt[len][c][val[j]].size()))%mod;
      }
    }
  }
  ll fnl=0;
  for(int i=8;i<=8;i++)
  {
    for(char c='a';c<='p';c++)
    {
      dp[i][c]=1;
      for(auto j:rma[i])
      {
        ll sm=0;
        for(char c1='a';c1<='p';c1++)
        {
          sm=(sm+(dp[j][c1]*(ll)(cnt[len][c][c1].size()))%mod)%mod;
        }
        dp[i][c]=(dp[i][c]*sm)%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));
    cnt[len][s[0]][s.back()].insert(s);
    if(t==s)continue;
    cnt[len][s.back()][s[0]].insert(t);
  }
  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...