按照字符串的长度排下序。从头开始判断当前一个串是否为后一个串的子串,如果是继续判断,如果不是输出NO,如果全部都是输出yes,输出排完序的所有串
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
struct Node
{
string str;
int len;
bool operator <(const Node &p)const
{
return len < p.len;
}
};
Node a[maxn];
bool judge(string str1,string str2)
{
for(int i = 0; i <= str2.size() - str1.size(); i++)
{
if(str2[i] == str1[0])
{
int j;
for(j = 0; j < str1.size(); j++)
{
if(str1[j] != str2[i + j])
{
break;
}
}
if(j==str1.size())return 1;
}
}
return 0;
}
int main()
{
int n;
cin >> n;
for(int i =0; i < n; i++)
{
cin >> a[i].str;
a[i].len = a[i].str.size();
}
sort(a,a+n);
int flag = 1;
for(int i = 0; i < n - 1; i++)
{
if(!judge(a[i].str,a[i+1].str))
{
flag = 0;
break;
}
}
if(flag)
{
cout << "YES" << endl;
for(int i = 0; i < n; i++)
{
cout << a[i].str << endl;
}
}
else
{
cout << "NO" << endl;
}
return 0;
}