RT。赛后 10min 过了,主要是修改了判定相邻两个区间是否具有完全相同的结构的部分。
但是蒟蒻想知道赛时写的这个究竟有什么问题呢?
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int mod=998244353;
int n,len,a[300005],dp[1000005];
string s;
void solve(int now,int &s0,int &s1)
{
if(now*2>=len)
{
dp[now]=1;
if(a[now]==0) s0=1;else s1=1;
return;
}
int ls0=0,ls1=0,rs0=0,rs1=0;
solve(now*2,ls0,ls1);
solve(now*2+1,rs0,rs1);
dp[now]=2ll*dp[now*2]*dp[now*2+1]%mod;
s0=ls0+rs0;s1=ls1+rs1;
if(a[now]==0) s0++;else s1++;
if(ls0!=rs0||ls1!=rs1) return;
if(dp[now*2]==dp[now*2+1])
dp[now]=(dp[now]-1ll*dp[now*2]*dp[now*2+1]%mod+mod)%mod;
}
int main()
{
cin>>n;
cin>>s;
len=(1<<n)-1;
for(int i=0;i<len;i++)
if(s[i]=='A') a[i+1]=0;
else a[i+1]=1;
int s0=0,s1=0;
solve(1,s0,s1);
cout<<dp[1];
return 0;
}
赛后的 AC 代码:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int mod=998244353;
int n,len,a[1000005],dp[1000005];
string s;
string solve(int now)
{
if(now*2>len)
{
dp[now]=1;
string tmp=""+s[now-1];
return tmp;
}
string ls=solve(now*2);
string rs=solve(now*2+1);
dp[now]=2ll*dp[now*2]*dp[now*2+1]%mod;
if(ls==rs)
{
dp[now]=(dp[now]-1ll*dp[now*2]*dp[now*2+1]%mod+mod)%mod;
return (s[now-1]+ls+rs);
}
if(ls<rs) return (s[now-1]+ls+rs);
else return (s[now-1]+rs+ls);
}
int main()
{
cin>>n;
cin>>s;
len=(1<<n)-1;
solve(1);
cout<<dp[1];
return 0;
}