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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值