60分,太菜了,以后有时间回顾
#include<bits/stdc++.h>
#define mod 998244353
/*
1 2
2 4
4 16
6 64
从左往右恢复
对于字符串左边的第一个数字
1 上一个 4(右边下一个一定是6)
2 上一个 1
4 上一个 2 或 6(此时左边加一个6)
6 上一个 4(此时左边加一个1) 或 6 (右边下一个一定是4)
对于字符串右边的第一个数字 //用不上
1 上一个 4(右边下一个一定是6)
2 上一个 1
4 上一个 2 或 6(此时左边加一个6)
6 上一个 4(此时左边加一个1) 或 6 (右边下一个一定是4)
对于字符串不处于首尾之间
1 上一个 4(右边下一个一定是6)
2 上一个 1
4 上一个 2
6 上一个 6 (右边下一个一定是4)
状态递推
*/
using namespace std;
int f[10] ; //起始为1
int n;
vector<pair<int,int> > V;
void update()//递推一次
{
int a,b,c,d;
a=f[1];b=f[2];c=f[4];d=f[6];
f[1]=c;f[2]=a;f[4]=(b+d)%mod;f[6]=(c+d)%mod;
}
void f_(string s,int num)
{
//cout<<s<<" abc "<<num<<endl;
if(num>=n)
return;
if(s.size()==1)
{
V.push_back(pair<int,int>(n-num,s[0]-'0'));
//cout<<n-num<<" "<<s[0]<<endl;
return ;
}
//左边无需加
string v="";
int w=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='1')
{
v=v+"4";
i++;
if(i<s.size()&&s[i]!='6')
{
w=1;
break;
}
}
else if(s[i]=='2')
v=v+"1";
else if(s[i]=='4')
v=v+"2";
else if(s[i]=='6')
{
v=v+"6",i++;
if(i<s.size()&&s[i]!='4')
{
w=1;
break;
}
}
}
if(w==0)
f_(v,num+1);
//左边处理
if(s[0]=='4')
{
string v="";
string ss="6"+s;
for(int i=0;i<ss.size();i++)
{
if(ss[i]=='1')
{
v=v+"4",i++;
if(i<ss.size()&&ss[i]!='6')
return ;
}
else if(ss[i]=='2')
v=v+"1";
else if(ss[i]=='4')
v=v+"2";
else if(ss[i]=='6')
{
v=v+"6",i++;
if(i<ss.size()&&ss[i]!='4')
return ;
}
}
f_(v,num+1);
}
else if(s[0]=='6')
{
string v="";
string ss="1"+s;
for(int i=0;i<ss.size();i++)
{
if(ss[i]=='1')
{
v=v+"4",i++;
if(i<ss.size()&&ss[i]!='6')
return ;
}
else if(ss[i]=='2')
v=v+"1";
else if(ss[i]=='4')
v=v+"2";
else if(ss[i]=='6')
{
v=v+"6",i++;
if(i<ss.size()&&ss[i]!='4')
return ;
}
}
f_(v,num+1);
}
}
int main()
{
string s;
cin>>n;
cin>>s;
f_(s,0);
sort(V.begin(),V.end());
long long ans=0;
int i=0;
f[1]=1;
for(int j=0;j<V.size();j++)
{
while(i<V[j].first)
{
update();
i++;
}
ans+=f[V[j].second];
ans%=mod;
}
cout<<ans<<endl;
return 0;
}