<< 剰余演算練習 | top | ABC048-C Boxes and Candies >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

ABC049-C 白昼夢

これから解いた問題全ての解答を上げるのは面倒くさいので、お、というものだけ上げていきます。

しばらくはABCのC問題を埋めていくか。

アルゴリズムの基礎が問われるレベルらしいし、やってみた感じ今の僕にちょうどいい感じ。

ちょっと考えればそんなに難しくはないけど、どの問題も何かしら経験値が溜まる感じ。

 

問題文

英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。

  • T の末尾に dream dreamer erase eraser のいずれかを追加する。

 

前から探索すると、例えばdreamなのかdreamerなのか判別するのが難しいけど、後ろからやれば簡単。後ろからやれば後ろ3文字で判別できる。判別できたら文字列から除いてやればok。

#include <iostream>
#include <string>

int main()
{
	std::string str; std::cin >> str;
	std::string ans("YES");
	while(!str.empty())
	{
		if(str.size() < 5)
		{
			ans = "NO";
			break;
		}
		std::string s = str.substr(str.size()-3);
		if(s=="eam")//dream
		{
			if(str.substr(str.size()-5)=="dream") str.erase(str.size()-5, 5);
			else
			{
				ans = "NO";
				break;
			}
		}
		else if(s=="mer")//dreamer
		{
			if(str.size() < 7)
			{
				ans = "NO";
				break;
			}
			if(str.substr(str.size()-7)=="dreamer") str.erase(str.size()-7, 7);
			else
			{
				ans = "NO";
				break;
			}
		}
		else if(s=="ase")//erase
		{
			if(str.substr(str.size()-5)=="erase") str.erase(str.size()-5, 5);
			else
			{
				ans = "NO";
				break;
			}
		}
		else if(s=="ser")//eraser
		{
			if(str.size() < 6)
			{
				ans = "NO";
				break;
			}
			if(str.substr(str.size()-6)=="eraser") str.erase(str.size()-6, 6);
			else
			{
				ans = "NO";
				break;
			}
		}
		else
		{
			ans = "NO";
			break;
		}
	}
	std::cout << ans << std::endl;
	return 0;
}
前からが難しければ後ろからね。
ジャジャガッチ | C/C++ | 12:37 | comments(0) | trackbacks(0) |

スポンサーサイト

スポンサードリンク | - | 12:37 | - | - |
Comment









Trackback
URL:

07
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH