Kitty猫基因编码

Kitty猫基因编码 ⁡ \operatorname{Kitty猫基因编码} Kitty

题目链接: luogu P2562 ⁡ \operatorname{luogu\ P2562} luogu P2562

题目

小可可选修了基础生物基因学。教授告诉大家 Super Samuel 星球上 Kitty 猫的基因的长度都是 2 2 2 的正整数次幂 ), 全是由两种不同的基因单元组成的。 这两种不同的基因单元分别记成 0 0 0 1 1 1 ,于是 Kitty 猫基因可以写成一个 01 串表达式 。

为了便于分析和降低数据存储量,教授发明了 ABC 编码规则。该编码规则是不断地按照
在这里插入图片描述
对 Kitty 猫基因 01 串表达式 进行改写, 直至最终被改写成只含有字符 “A” 、“B” 、“C” 的符号串。
Kitty猫基因编码_第1张图片
请你编写程序帮助小可可求出 Kitty 猫基因的 ABC 编码以协助教授开展科研工作。

输入

文件中以一行的形式存放了一个 Kitty 猫基因的 01 串表达式。

输出

以一行的形式输出这个 Kitty 猫基因的 ABC 编码。

样例输入1

00

样例输出1

A

样例输入2

01001011

样例输出2

CCCABACCBAB

数据范围

给出的 01 字符串长度 L e n ≤ 256 Len\leq 256 Len256

思路

这道题其实和我之前做过的 FBI树 很像,只有几点不同:

  1. FBI 树中就算是全 0 0 0 或者全 1 1 1 串,都要继续递归,但是这个不用
  2. FBI 树后序遍历,这个是先序遍历
  3. FBI 树给出了 n n n ,而这个没有

代码

#include
#include

using namespace std;

char a[1051];

void work(int l, int r) {
	int check = a[l] - '0';
	for (int i = l + 1; i <= r; i++)
		if ((a[i] - '0') != check) {
			check = -1;
			break;
		}
	
	if (check == -1) {
		printf("C");
		if (l < r) {
			int mid = (l + r) >> 1;
			work(l, mid);
			work(mid + 1, r);
		}
	}
	else if (check == 0) printf("A");
		else printf("B");
}

int main() {
	scanf("%s", &a);
	
	work(0, strlen(a) - 1);
	
	return 0;
} 

你可能感兴趣的:(#,模拟,#,dfs或bfs)