给出N个字符串,给他们排序,第一个是第二个的子串,第二个是第三个的子串,一直排到最后一个.问是否能实现这样的排序,如果能输出YES并且输出排序后的N个字符串;不能输出NO
题目不是很难,主要就是匹配子串上,而且题目数据很小,暴力一下也能过.写这个水题主要是因为去年自己不会
先按长度降序排列,这样一但出现不是子串的情况就能立刻判断不存在这样的排序.在这里用的字符hash判断是否是子串,hash不会见自我推销
#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define Pair pair<int,int>
#define re return
#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
const ull base=1e9+7;
template<class T> void _deb(const char *name,T val){
cout<<name<<val<<endl;
}
int N;
string store[105];
int seq[105];
ull Hash[105];
bool cmp(string a,string b);
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>N;
rep(i,0,N){
cin>>store[i];
}
sort(store,store+N,cmp);
//cout<<store[0]<<endl;
bool iSort=true;
rep(i,0,N-1){
string &org=store[i];
string &next=store[i+1];
int len_org=org.size();
int len_next=next.size();
//make hash
mem(Hash,0);
Hash[0]=0;
rep(pos,1,len_org+1){
Hash[pos]=Hash[pos-1]*base+org[pos-1]-'a';
}
//get substring hash
ull aim=0;
ull temp=1;
rep(pos,1,len_next+1){
aim=aim*base+next[pos-1]-'a';
temp*=base;
}
//match
ull hash1;
bool isFind=false;
rep(pos,len_next,len_org+1){
hash1=(Hash[pos]-Hash[pos-len_next]*temp);
if(hash1==aim){
isFind=true;
break;
}
}
if(!isFind){
iSort=false;
break;
}
}
if(iSort){
cout<<"YES"<<endl;
drep(i,N-1,0)
cout<<store[i]<<endl;
}else{
cout<<"NO"<<endl;
}
re 0;
}
bool cmp(string a,string b){
re a.size()>b.size();
}