Codeforce Round #486 (Div.3) B. Substrings Sort
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
The first line contains an integer nn (1≤n≤1001≤n≤100) — the number of strings.
The next nn
Some strings might be equal.
OutputIf it is impossible to reorder nn given strings in required order, print "NO" (without quotes).
Otherwise print "YES" (without quotes) and n
5 a aba abacaba ba abaoutputCopy
YES a ba aba aba abacabainputCopy
5 a abacaba ba aba ababoutputCopy
NOinputCopy
3 qwerty qwerty qwertyoutputCopy
YES qwerty qwerty qwertyNote
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;
}