Problem:
Princess, a Cryptanalyst

お姫様の暗号解読

English text is not available in this practice contest.

ある貧乏な国のおてんばで勇敢なお姫様は，お忍びで出かけた町である日本語で書かれた古文書を手に入れた．お姫様は日本語ができるため，さっそくこの古文書を読んでみた．すると，驚くべき事が分かった．この古文書は，古の秘宝の在処を示していたのである．ところが，秘宝の在処は暗号になっており，容易には分からないようになっていた．そこでお姫様は，従者であるあなたに暗号の解読を手伝うように命令を下した．

あなたはお姫様を助けるため昼夜を問わず調査を行った．その結果，Shortest Secret String (SSS) と呼ばれる文字列が解読に重要な役割を果たすことがわかった．ここで SSS とは，N 個の単語全部を部分文字列として含み，なおかつその長さが最小であるような文字列である．

あなたの仕事は，N 個の単語から SSS を見つけ出す事である．

Input

入力は複数のデータセットで与えられる．データセットの初めの一行は，データセットに含まれる単語の数N(1≦N≦10)が与えられる．続くN行に単語が与えられる．最後のデータセットの後に，0のみを含む一行が与えられる．

なお，入力で与えられる単語はアルファベット小文字のみからなり，長さは高々10であることが保証されている．

Output

各データセットについてSSS を一行に出力せよ．また，複数ある場合は辞書式順序で最小のものを出力せよ．

Sample Input

4
apple
length
things
thin
2
icp
cpc
3
zeta
eta
alphabet
2
until
till
0

Output for the Sample Input

applengthings
icpc
zetalphabet
untill

Solution in JAVA (judge verdict: Wrong Answer)

import java.util.Scanner;

public class Main{
	public Main(){
		Scanner sc = new Scanner(System.in);
		
		while(true){
			int n = sc.nextInt();
			if(n == 0){
				break;
			}
			String str = sc.next();
			for(int i = 1, l = str.length(); i < n; i++, l = str.length()){
				String s = sc.next();
				String st = func(str, s, l);
				l = s.length();
				str = func(s, str, l);
				if(str.length() > st.length()){
					str = st;
				} else if(str.length() == st.length()){
					if(str.charAt(0) > st.charAt(0)){
						str = st;
					}
				}
			}
			System.out.println(str);
		}
	}
	
	private String func(String str, String s, int l){
		int p = 0, k, o;
		String smax = "";
		for(int j = 0, m = s.length(); j < l; j++){
			if(str.substring(j, j+1).equals(s.substring(0, 1))){
				for(k = 1, o = l-j; k < m && k < o; k++){
					if(!(str.substring((j+k),(j+k+1)).equals(s.substring(k, k+1)))){
						break;
					}
				}
				if(p < k){
					p = k;
					smax = str.substring(j, j+k);
				}
			}
		}
		
		return str.replace(smax, s);
	}
	
	public static void main(String[] args){
		new Main();
	}
}