一共三种情况,除此之外就是其他情况。
另外注意如果有多种情况,要取考前的那种。
给定字符串的起点和终点然后记忆化搜索即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ll long long
#define MAXN 1005
#define INF 2139062143
using namespace std;
int dp[MAXN][MAXN];
char str[MAXN];
int L;
int solve(int x,int y)
{
if(!(x<=y)) return 0;
if(dp[x][y]!=INF) return dp[x][y];
if(x==y&&str[x]=='A') return dp[x][y]=1;
if(y-1>=0&&str[y]=='A'&&solve(x,y-1)) return dp[x][y]=min(1,dp[x][y]);
if(y-2>=0&&str[y-1]=='A'&&str[y]=='B'&&solve(x,y-2)) return dp[x][y]=min(2,dp[x][y]);
if(str[x]=='B'&&str[y]=='A'&&solve(x+1,y-1)) return dp[x][y]=min(3,dp[x][y]);
return dp[x][y]=0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
memset(dp,0x7f,sizeof(dp));
L=strlen(str);
solve(0,L-1);
switch(dp[0][L-1])
{
case 0:
puts("MUTANT");
break;
case 1:
puts("SIMPLE");
break;
case 2:
puts("FULLY-GROWN");
break;
case 3:
puts("MUTAGENIC");
break;
}
}
return 0;
}