• LightOJ 1051


    A string is called bad if it has 3 vowels in a row, or 5 consonants in a row, or both. A string is called good if it is not bad. You are given a string s, consisting of uppercase letters ('A'-'Z') and question marks ('?'). Return "BAD" if the string is definitely bad (that means you cannot substitute letters for question marks so that the string becomes good), "GOOD" if the string is definitely good, and "MIXED" if it can be either bad or good.

    The letters 'A', 'E', 'I', 'O', 'U' are vowels, and all others are consonants.

    Input

    Input starts with an integer T (≤ 200), denoting the number of test cases.

    Each case begins with a non-empty string with length no more than 50.

    Output

    For each case of input you have to print the case number and the result according to the description.

    Sample Input

    5
    FFFF?EE
    HELLOWORLD
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    HELLO?ORLD
    AAA
    

    Output for Sample Input

    Case 1: BAD
    Case 2: GOOD
    Case 3: BAD
    Case 4: MIXED
    Case 5: BAD
    

    题目大意就是说如果一个字符串有连续5个辅音或者3个元音就是称这个字符串为"BAD",否则称为"GOOD". 对于一个字符串,其中有"?"存在,"?"可以当成元音也可以当成辅音. 所以对于有问号的字符串有可能是"BAD"也有可能是"GOOD".此时称为这个字符串为"MIXED".

    现在问所给字符串为哪种类型。

    模拟:

    • 先不计"?",判断是否有连续三个元音或者连续五个元音的情况。如果有的话直接就是"BAD"
    • 如果第一步没有的话,则把所有问号当成元音或者辅音,判断这样的情况是否存在连续三个元音或者连续5个元音。如果没有的话直接是"GOOD".
    • 如果有的话就要判断是否可以组成"MIXED". 要想组成"MIXED",必须不能存在连续三个元音或者连续五个元音的情况,所以对于每一个问号就要进行一个特殊判断.

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    
    bool judge(char ch)
    {
    	if(ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U')
    		return true;
    	return false;
    }
    
    string solve()
    {
    	string str;
    	cin >> str;
    	for(int i=0, a=0, b=0; i<str.size(); ++ i)
    	{
    		if(str[i] == '?')
    			a = 0, b = 0;
    		else if(judge(str[i]))
    			++ a, b = 0;
    		else
    			++ b, a = 0;
    
    		if(a == 3 || b == 5)
    			return string{"BAD"};
    	}
    	bool is = false;
    	for(int i=0, a=0, b=0; i<str.size(); ++ i)
    	{
    		if(str[i] == '?')
    			++ a, ++ b;
    		else if(judge(str[i]))
    			++ a, b = 0;
    		else
    			++ b, a = 0;
    		if(a == 3 || b == 5)
    		{
    			is = true;
    			break;
    		}
    	}
    	if(is == false)
    		return string{"GOOD"};
    
    	for(int i=0; i<str.size(); ++ i)
    	{
    		if(str[i] == '?')
    		{
    			int leftvow = 0, leftcon = 0, rightvow = 0, rightcon = 0;
    			for(int j=i-1; j>=0; -- j)
    			{
    				if(str[j] == '?')
    					break;
    
    				if(judge(str[j]))
    				{
    					if(leftcon)
    						break;
    					++ leftvow;
    				}
    				else
    				{
    					if(leftvow)
    						break;
    					++ leftcon;
    				}
    			}
    
    			for(int j=i+1; j<str.size(); ++ j)
    			{
    				if(str[j] == '?')
    					break;
    
    				if(judge(str[j]))
    				{
    					if(rightcon)
    						break;
    					++ rightvow;
    				}
    				else
    				{
    					if(rightvow)
    						break;
    					++ rightcon;
    				}
    			}
    
    			if((leftvow == 2 && rightcon == 4) || (leftcon == 4 && rightvow == 2))
    				return string{"BAD"};
    
    			if(leftcon == 4 || rightcon == 4)
    				str[i] = 'A';
    
    			if(leftvow == 2 || rightvow == 2)
    				str[i] = 'B';
    		}
    	}
    	return string{"MIXED"};
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	
    	//freopen("in.txt", "r", stdin);
    	//freopen("out.txt", "w", stdout);
    
    	int t;
    	cin >> t;
    	for(int i=1; i<=t; ++ i)
    		cout << "Case " << i << ": " << solve().c_str() << endl;
    	return 0;
    }
    
    
    
  • 相关阅读:
    校内题目T2695 桶哥的问题——吃桶
    一位大佬对学习哲理的思考
    P2845 [USACO15DEC]Switching on the Lights 开关灯
    CF911F Tree Destruction
    CF995C Leaving the Bar
    CF997B Roman Digits
    P1667 数列
    P4035 [JSOI2008]球形空间产生器
    P2679 子串
    P2613 【模板】有理数取余
  • 原文地址:https://www.cnblogs.com/aiterator/p/6785826.html
Copyright © 2020-2023  润新知