Problem:
こぶたぬきつねこ

A子さんの家に親戚のB男君がやってきました。彼は3歳で歌が大好きです。彼は幼稚園でならった「こぶたぬきつねこ」(山本直純作詞・作曲)という歌を一生懸命に歌っています。この歌では、4つのことば「こぶた」 「たぬき」 「きつね」「ねこ」が順にしりとりになっていて、さらに最後の音と最初の音が同じになっています。B男君は、A子さんに、同じようなしりとりが、B男君が言った単語から作れるか教えて欲しいと言われました。

そこで、A子さんを助けるために、与えられた単語から、その単語をすべて使って、順にしりとりをつくり、その上で、 第1 の単語の最初の文字と最終の単語の最後の文字が同じであるようにできるか否かを判定するプログラムを作成しましょう。

n 個の単語を入力とし、それらの単語の組からしりとりを作成できるか否かを判定し、可能な場合はOK と、不可能な場合は NG と出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

n
word1
word2
:
wordn

1 行目に単語の個数 n (2 ≤ n ≤ 10000) が与えられます。続く n 行に n 個の単語 wordi (32 文字以下の半角英小文字だけからなる文字列) が与えられます。

データセットの数は 50 を超えません。

Output

入力データセットごとに、判定結果を１行に出力します。

Sample Input

5
apple
yellow
georgia
king
email
7
apple
yellow
georgia
king
email
wink
lucky
0

Output for the Sample Input

NG
OK

Solution in C++ (judge verdict: Time Limit Exceeded)

#include<iostream>
#include<cstring>
#include<cstdlib>

char str[10000][32];
char str2[10000][3];
int n;
char first;
bool isFst = 1;
int use;

int loopcnt = 0;

//ツ使ツ用ツ催渉づ敖つゥツ氾崢つゥ
int isUsed[10000] = {0};

int check(char str[], int num);

using namespace std;

int main()
{
	for(;;){
		int ok = 0;
		isFst = 1;
		int sub;
		
		scanf("%d",&n);
		
		if(n == 0){
			break;
		}
		for(int i = 0; i < n; i++){
			scanf("%s",str[i]);
			str2[i][0] = str[i][0];
			
		}
		
		//ツ閉カツ篠堋療アツ短ツ縮
		for(int i = 0; i < n; i++){
			sub = strlen(str[i]);
			str2[i][1] =  str[i][sub-1];
		}
		
		
		for(int i = 0; i < n; i++){
//			printf("ツ個淞催オツ閉カツ篠堋療ア >> %s\n",str[i]);
			for(int i = 0; i < n; i++){
				isUsed[i] = 0;
			}
			if(check(str2[i], i) == 1){
				ok = 1;
				break;
			}
		}
		
		if(ok == 1){
			printf("OK\n");
		}
		else{
			printf("NG\n");
		}
		
	}
}

int check(char s[], int num)
{
	int i;
	bool Fin = 0;
	bool find = 0;
	
//	printf("ツ妥篠湘崢閉カツ篠堋療アツ：%s\n",s);
	loopcnt++;
	if(loopcnt > 5000000){
		printf("NG");
		exit(1);
	}
	
	//ツ暗クツ青板づ個閉カツ篠堋療アツづーツ使ツ用
	isUsed[num] = 1;
	use++;
	
	//ツ催古」ツづ個閉カツ篠堋づーchツづ可格ツ納
	char ch = s[1];
	
	//ツつアツづ個閉カツ篠堋つェツづつづ按つェツづェツづ篠つオツづィツづづィツ環ョツ青ャ
	if(isFst == 1){
		first = s[0];
		isFst = 0;
//		printf("%cツづ可づつづ按つェツづェツづ篠つ「ツつ「ツづヲツ。\n",first);
	}
	
	if(use == n){
		Fin = 1;
	}
	if(Fin == 1 && ch != first){
		Fin = 0;
	}
	
	else{
		//ツ単ツ古ェツδ環スツトツづ個陳つゥツづァchツづ始ツづ慊づゥツ単ツ古ェツづーツ個淞催オ
		for(i = 0; i < n; i++){
			if(str2[i][0] == ch && i != num && isUsed[i] == 0){
//				cout << str[i] << "ツづ可づつづ按つェツづゥツづ思ツつ、"<<endl;
				find = 1;
				break;
			}
		}
	}
	
	
	if(find == 1){
		return check(str2[i],i);
	}
	
	else if(Fin == 1){
//		cout << "ツ青ャツ古キツ！ツ探ツ催オツ終ツ猟ケツ！" << endl;
		return 1;
	}
	else{
//		cout << "ツ篠クツ敗ツつオツつソツづ。ツづつスツ…" << endl;
//		cout << endl;
		isFst = 1;
		use = 0;
		return 0;
	}
}