这题真的很难理解,看了别人的解析才明白是在讲什么,其实做起来不算难。
题目大意:
给定一个细胞链,只有AB两种字母组成。
有三种方式,一种是从物到有生成A,一种是在原有的基础上,加上AB,一种是B+原有的字符串+A,O代表是正常的细胞链,最后看一下这个细胞链是否是由这些组合构成的,输出最后的操作。如果不是这三种方式中的一种,那么该细胞链已变异,作为第四种输出。
解析:
不算dp,直接dfs就好了。从外向内dfs,看中间的那个是否为A,如果为A就ok,否则就变异,如果ok就对字符串,进行判断,是上面三种中的哪一种情况。
题目大意:
给定一个细胞链,只有AB两种字母组成。
有三种方式,一种是从物到有生成A,一种是在原有的基础上,加上AB,一种是B+原有的字符串+A,O代表是正常的细胞链,最后看一下这个细胞链是否是由这些组合构成的,输出最后的操作。如果不是这三种方式中的一种,那么该细胞链已变异,作为第四种输出。
解析:
不算dp,直接dfs就好了。从外向内dfs,看中间的那个是否为A,如果为A就ok,否则就变异,如果ok就对字符串,进行判断,是上面三种中的哪一种情况。
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1000;
char cells[N];
bool ok;
void dfs(int l,int r) {
if(l == r-1) {
return;
}
if(l == r) {
if(cells[l] == 'A') {
ok = true;
}
return ;
}
if(cells[l] == 'B' && cells[r] == 'A') {
dfs(l+1,r-1);
}
if(cells[r-1] == 'A' && cells[r] == 'B') {
dfs(l,r-2);
}
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%s",cells);
int len = strlen(cells);
ok = false;
dfs(0,len-1);
if(!ok) {
printf("MUTANT\n");
}else {
if(len == 1 && cells[0] == 'A') {
printf("SIMPLE\n");
}else if(cells[0] == 'B' && cells[len-1] == 'A'){
printf("MUTAGENIC\n");
}else if(cells[len-2] == 'A' && cells[len-1] == 'B') {
printf("FULLY-GROWN\n");
}
}
}
return 0;
}