遍历ASC树
题目描述
面对难题我们总是想要AC掉它。现在有一个由字母A
和C
组成的字符串,我们将它们组成的字符串分为三类:全A
串、全C
串、混合串,期中既有A
又有C
的混合串我们称之为S
串。
ASC树一种特殊的二叉树,它的结点包括A
、S
和C
三种结点。对于一个长度为2N 的AC串 str
,可以构造出一颗ASC
树T,递归的构造方法如下:
- T的根结点为R,其类型与串
str
的类型相同; - 若串
str
的长度大于1,将串str从中间分开,分为等长的左右子串str1
和str2
;由左子串str1
构造R
的左子树T1,由右子串str2
构造R的右子树T2。
现在给你一个长度为2N的AC串,请用以上的方式构造出一颗ASC树,并输出它的前序遍历序列。
输入格式
第一行是一个整数N(0≤N≤10) ,
第二行是一个长度为2N 的AC串。
输出格式
一个字符串,即ASC树的前序遍历序列。
样例 #1
样例输入 #1
3
ACACACCC
样例输出 #1
SSSACSACSSACCCC
提示
对于40%40% 的数据 , N≤ 2;
对于 100%100% 的数据 ,N≤10 。
#include <bits/stdc++.h>
using namespace std;
const int N=5025;
char tr[N];
void dfs(int pos,string s)
{
int len=s.size();
if(len==1)
{
tr[pos]=s[0];
return ;
}
int mid=len/2;
dfs(2*pos,s.substr(0,len/2));
dfs(2*pos+1,s.substr(mid,len/2));
if(tr[pos*2]==tr[2*pos+1])
{
tr[pos]=tr[pos*2];
}
else
{
tr[pos]='S';
}
}
void dfsPre(int pos,int len)
{
if(len==0)
{
return ;
}
cout<<tr[pos];
dfsPre(2*pos,len/2);
dfsPre(2*pos+1,len/2);
}
int main()
{
int n;
string str;
cin>>n;
cin>>str;
dfs(1,str);
dfsPre(1,str.size());
return 0;
}