Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

D: パスワード

問題

AOR イカちゃんは英小文字のみからなる強力なパスワードを作りたいと思っています。
友達から $N$ 個の危険なパスワードの例を教えてもらった AOR イカちゃんは、
以下の条件を全て満たすようなパスワードを作ることにしました。

長さは1文字以上である。

どの危険なパスワードの、どの連続した部分文字列とも異なる。

1, 2 の条件を満たした中で、最も短い文字列である。

1,2,3の条件を満たした中で、辞書順に並べたとき先頭に来る文字列である。

AOR イカちゃんに代わって強力なパスワードを生成するプログラムを書いてください。

入力

入力は以下の形式で標準入力から与えられる。

$N$

$S_1$

$\vdots$

$S_N$

1 行目には、文字列の数を表す整数 $N$ が与えられる。

2 行目からの $N$ 行には、文字列 $S_i$ が与えられる。

$|S_i|$ とは文字列の長さであり、1 文字以上である。

$1 \le N \le 100,000$ を満たす。

$1 \le \sum_{1\le i \le N} |S_i| \le 400,000$ を満たす。

文字列は英小文字のみを含む。

出力

答えを 1 行で出力せよ。また、末尾に改行も出力せよ。

サンプル

サンプル入力 1

5
password
login
admin
root
master

サンプル出力 1

b

サンプル入力 2

3
abcdefghijklmnopqrstuvwxy
qwertyuiopasdfghjklxcvbnm
qawsxedcrfvtgbyhnujmikolp

サンプル出力 2

z

サンプル入力 3

1
abcdefghijklmnopqrstuvwxyz

サンプル出力 3

aa

Solution in C++11 (judge verdict: Accepted)

#include<bits/stdc++.h>
using namespace std;
unordered_set<string> a;
int main(){
	int n;
	cin>>n;
	string s[n];
	for(int i=0;i<n;i++)cin>>s[i];
	for(int i=1;i<6;i++){
		for(int j=0;j<n;j++){
			for(int k=0;k<s[j].size();k++){
				if(k+i<=s[j].size())a.insert(s[j].substr(k,i));
			}
		}
	}
	for(int i=0;i<27;i++)
		for(int j=0;j<27;j++)
			for(int k=0;k<27;k++)
				for(int l=0;l<26;l++){
					string t;
					if(i)t+='a'-1+i;
					if(j)t+='a'-1+j;
					if(k)t+='a'-1+k;
					t+='a'+l;
					if(!a.count(t)){
						cout<<t<<endl;
						return 0;
					}
				}
}