1. 程式人生 > >Codeforce Round #486 (Div.3) B. Substrings Sort

Codeforce Round #486 (Div.3) B. Substrings Sort

B. Substrings Sorttime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard output

You are given nn strings. Each string consists of lowercase English letters. Rearrange (reorder) the given strings in such a way that for every string, all strings that are placed before it are its substrings.

String aa is a substring of string bb if it is possible to choose several consecutive letters in b

b in such a way that they form aa. For example, string "for" is contained as a substring in strings "codeforces", "for" and "therefore", but is not contained as a substring in strings "four", "fofo" and "rof".

Input

The first line contains an integer nn (1n1001≤n≤100) — the number of strings.

The next nn

 lines contain the given strings. The number of letters in each string is from 11 to 100100, inclusive. Each string consists of lowercase English letters.

Some strings might be equal.

Output

If it is impossible to reorder nn given strings in required order, print "NO" (without quotes).

Otherwise print "YES" (without quotes) and n

n given strings in required order.

ExamplesinputCopy
5
a
aba
abacaba
ba
aba
outputCopy
YES
a
ba
aba
aba
abacaba
inputCopy
5
a
abacaba
ba
aba
abab
outputCopy
NO
inputCopy
3
qwerty
qwerty
qwerty
outputCopy
YES
qwerty
qwerty
qwerty
Note

In the second example you cannot reorder the strings because the string "abab" is not a substring of the string "abacaba".

題意:給你一堆字串,能不能把它們排序,排成從上到下,上面一個是下面一個的子字串的格式,能就按格式全部輸出,不能就輸出“NO”.

#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b){
	if(a.length()==b.length()){
		return a<b;
	}return a.length()<b.length();   //先把所有字串排序 
}                                    //按字串長度,字典序排序 
string a[200];
int main(){
	int m;
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>a[i];
	}
	sort(a,a+m,cmp);
	
	bool ff=true;
	for(int i=0;i<m-1;i++){                 //遍歷所有 
	    bool f=true;
		int t=a[i].length();
		string temp=a[i+1];
		int tt=a[i+1].length();
		for(int j=0;j<=tt-t;j++){           
			if(temp.substr(j,t)==a[i]){    //兩個兩個檢查,假如其中有一組(兩個相鄰)的,不合要求,標記 
				f=false;                  
			}
		}
		if(f){
			ff=false;         //利用標記退出; 
			break;
		}
	}
	if(!ff){
		cout<<"NO"<<endl;
	}
	else {
		cout<<"YES"<<endl;
		for(int i=0;i<m;i++){
			cout<<a[i]<<endl;
		}
	}
	return 0;
}