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 猫基因的 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<cstdio>
#include<cstring>

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;
} 

猜你喜欢

转载自blog.csdn.net/weixin_43346722/article/details/108130973