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# (judge verdict: Accepted)

using System.Collections.Generic;
using System.Linq;
using static System.Math;
using System;

public class Hello
{
    public static void Main()
    {
        var aLp = "abcdefghijklmnopqrstuvwxyz";
        var d = new Dictionary<string, int>();
        var d2 = new Dictionary<int, string>();
        for (int i = 1; i <= 26; i++)
        {
            var w = aLp.Substring(i - 1, 1);
            d[w] = i;
            d2[i] = w;
        }
        var n = int.Parse(Console.ReadLine().Trim());
        var a = new string[n];
        for (int i = 0; i < n; i++) a[i] = Console.ReadLine().Trim();
        var ans = "";
        for (int i = 1; i <= 4; i++)
        {
            var hs = getP(a, d, i);
            if (hs.Count() == (int)Pow(26, i)) continue;
            else
            {
                if (i == 1) ans = getAns1(hs, d2);
                else if (i == 2) ans = getAns2(hs, d2);
                else if (i == 3) ans = getAns3(hs, d2);
                else ans = getAns4(hs, d2);
                break;
            }
        }
        Console.WriteLine(ans);
    }
    static string getAns4(HashSet<int> hs, Dictionary<int, string> d2)
    {
        for (int i = 1; i <= 26; i++)
            for (int j = 1; j <= 26; j++)
                for (int k = 1; k <= 26; k++)
                    for (int L = 1; L <= 26; L++)
                        if (hs.Add(i * 1000000 + j * 10000 + k * 100 + L)) return d2[i] + d2[j] + d2[k] + d2[L];
        return "";
    }
    static string getAns3(HashSet<int> hs, Dictionary<int, string> d2)
    {
        for (int i = 1; i <= 26; i++)
            for (int j = 1; j <= 26; j++)
                for (int k = 1; k <= 26; k++)
                    if (hs.Add(i * 10000 + j * 100 + k)) return d2[i] + d2[j] + d2[k];
        return "";
    }
    static string getAns2(HashSet<int> hs, Dictionary<int, string> d2)
    {
        for (int i = 1; i <= 26; i++)
            for (int j = 1; j <= 26; j++)
                if (hs.Add(i * 100 + j)) return d2[i] + d2[j];
        return "";
    }
    static string getAns1(HashSet<int> hs, Dictionary<int, string> d2)
    {
        for (int i = 1; i <= 26; i++)
            if (hs.Add(i)) return d2[i];
        return "";
    }
    static HashSet<int> getP(string[] a, Dictionary<string, int> d, int k)
    {
        var hs = new HashSet<int>();
        foreach (var x in a)
            for (int i = 0; i <= x.Length - k; i++)
            {
                var w = x.Substring(i, k);
                var t = 0;
                for (int j = 0; j < k; j++)
                    t += d[w.Substring(j, 1)] * (int)Pow(10, (k - j - 1) * 2);
                hs.Add(t);
            }
        return hs;
    }
}