关于我赛时写的这个 E 有什么问题
  • 板块灌水区
  • 楼主donghanwen1225
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/4/23 00:56
  • 上次更新2023/10/28 03:05:48
查看原帖
关于我赛时写的这个 E 有什么问题
153687
donghanwen1225楼主2022/4/23 00:56

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;
}
2022/4/23 00:56
加载中...