题记
这道题的关键点在于能看出来长度为1和2的字符串的组合是一定的,一共14种,自己可以推一下,有些是不存在的
#include <iostream>
#include <map>
#include <string>
using namespace std;
typedef long long LL;
const int Maxn=5e5+10;//int数组一般开到5e5
const int mod=998244353;
LL dp[Maxn][15]={0};//dp[i][j]:第i秒j号字符串出现的次数
map<string,int> mp;//字符串到标号的映射
LL n;
string str;
int main()
{
cin>>n;
cin>>str;
mp["1"]=1;mp["2"]=2;mp["4"]=3;mp["6"]=4;
mp["16"]=5;mp["26"]=6;mp["41"]=7;mp["42"]=8;
mp["44"]=9;mp["46"]=10;mp["61"]=11;mp["62"]=12;
mp["64"]=13;mp["66"]=14;
//对于每一个字符串观察它由上一步那些字符串变换而来(注意是直接!!!)
//比如64 它可以由6和42直接变换而来,虽然16、46、62、64、66都可以但是其实是由内含的6造成的
//如果都加上会造成重复计算
dp[1][2]=1;
for(int i=1;i<=n;i++){
dp[i+1][1]=dp[i][3];
dp[i+1][2]=dp[i][1];
dp[i+1][3]=dp[i][2]+dp[i][4];
dp[i+1][4]=dp[i][3]+dp[i][4];
dp[i+1][5]=dp[i][3];
dp[i+1][6]=dp[i][5];
dp[i+1][7]=dp[i][13];
dp[i+1][8]=dp[i][11];
dp[i+1][9]=dp[i][12];
dp[i+1][10]=dp[i][6]+dp[i][14];
dp[i+1][11]=dp[i][9];
dp[i+1][12]=dp[i][7];
dp[i+1][13]=dp[i][8]+dp[i][4];
dp[i+1][14]=dp[i][10];
for(int j=1;j<=14;j++)
dp[i+1][j]=dp[i+1][j]%mod;
}
int index=mp[str];
cout<<dp[n][index]<<endl;
return 0;
}