ぐってぃのプログラミング日記

競技プログラミングやIT関係の記事を書いていくよ

AtCoder Beginners Contest 058 C-怪文書

問題

beta.atcoder.jp


S1,...,Sn のどの文字列が書かれていても作れる文字列のうち、最長のものを求めてください。 最長のものが複数ある場合は、辞書順で最小のものを求めてください。



考察

入力される文字列すべてにおいて英字aが何回出てくるか数えて、最も出現回数の少ないものを出力する

 

例えば

A aabb

B ab

C aabbb

があるとする。

まず、文字aが文字列ABCの中で出現回数が一番小さい文字列を確定させる。

文字列Bが一回だけaがでてくるので、aが出力される。

 

これをa ~ zまで繰り返していくと、辞書順に最長文字列を得ることができる

 

コード

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;
string s[60] = {};
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s[i];
	}
	string ans;
	for (char c = 'a'; c <= 'z'; c++)
	{
		int small = 100;

		for (int i = 0; i < n; i++)
		{
			int cnt = 0;
			for (int j = 0; j < s[i].length(); j++)
			{
				if (s[i][j] == c)cnt++;

			}
			small = min(small, cnt);
		}
		for (int i = 0; i < small; i++)
		{
			ans += c;
		}

	}
	cout << ans << endl;

	return 0;
}

ポイント

①charのループで文字列判定を行う
このループ判定は良く使うので覚えておく!

良い問題でした。