社区讨论

我这个非递归后序与什么问题

P1087[NOIP 2004 普及组] FBI 树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo183ho5
此快照首次捕获于
2023/10/22 16:44
2 年前
此快照最后确认于
2023/11/02 16:34
2 年前
查看原帖
样例本地可: 评测第一个点好像就是样例来着,可是没过。
我的思路: 枚举每一个叶节点a[i],并找出i之前的所有到i距离2^x(i%(2^x)==0,即防止i==6,(2^x)==4,结果把2~6算进去的情况)的所有情况,相当于找根节点。
我的语言可能比较抽象,所以下面以样例为例写一下
CPP
3
10001011
i==1,a[i]为I串,put I 。向前无串
i==2,a[i]为B串,put B。向前有长度为2的串,遍历,为F,put F
i==3,a[i]为B串,put B。向前无串(2~3虽有2^1,但3%2!=0)
i==4,a[i]为B串,put B。向前有长度2,4的串(2先,从小到大判断),长度为2的串为3~4,为B串,put B。成都4的同理,put F
以此类推

代码如下
CPP
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
	int ans=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		ans=ans*10+c-'0';
		c=getchar();
	}
	return ans*f;
}
int n;
char a[2048];
int main()
{

	freopen("Sort.in","r",stdin);
	freopen("Sort.out","w",stdout);
	n=read();
	int tmp=pow(2,n);			
	for(int i=1;i<=tmp;i++)
	{
		a[i]=getchar();
	}
	for(int i=1;i<=tmp;i++)		
	{
		for(int j=1;j<=tmp;j*=2)	
		{
			if(i%j==0)
			{
				if(j==1)
				{
					if(a[i]=='1')
					{
						putchar('I');
					}
					else
					{
						putchar('B');
					}
				}
				else
				{
					if(i%j==0)
					{
						bool flagI=0,flagB=0,flagF=0;
						for(int l=i-j+1;l<=i;l++)
						{
							if(a[l]=='1')
							{
								flagI=1;
							}
							if(a[l]=='0')
							{
								flagB=1;
							}
							if(flagI&&flagB==1)
							{
								putchar('F');
								flagF=1;
								break;
							}
						}
						if(flagF==0)
						{
							if(flagI==1)
							{
								putchar('I');
							}
							else
							{
								putchar('B');
							}
						}
					}
				}
			}
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...