CodeForce988B - 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 bb 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 (1≤n≤1001≤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 nn given strings in required order.

Examples

Input

5
a
aba
abacaba
ba
aba

Output

YES
a
ba
aba
aba
abacaba

Input

5
a
abacaba
ba
aba
abab

Output

NO

Input

3
qwerty
qwerty
qwerty

Output

YES
qwerty
qwerty
qwerty

一开始的代码:

经无数次测试它定义的compare函数里面数组越界,但不知道为什么!一定要明白!

#include <bits/stdc++.h>
using namespace std;
inline bool compare(string s1,string s2){
	bool res=true;
	int i,j;
	if(s1.size() > s2.size())//判断位数是否相同,位数多的那个自然就大
	  return !res;
	else if(s1.size() < s2.size())
	  return res;
	else{//当位数相同时,再逐个进行比较
		/*for(i=0;i<s1.size();i++){
			if(s1[i] < s2[i])//说明s1大于s2
			 return !res;
			else if(s1[i] > s2[i])//如果相等的话,就继续向下比较
			 return res;
		}*/
       return s1<s2;//用这句才对,用上面的就数组越界。
	}
}
int main(){
	int n,i;
	string data[1010];
	cin>>n;
	for(i=0;i<n;i++)
	  cin>>data[i];
   sort(data,data+n,compare);
    string::size_type idx; //特殊函数 string ::size_type idx;
    //网上找的判断字符串所属关系函数............
    for(i=0;i<n-1;i++)
    {
        string::size_type idx;
        idx=data[i+1].find(data[i]);
        if(idx == string::npos )//不存在。//if(idx==string::npos)
        {
            cout << "NO";
            return 0;
        }
    }
    cout<<"YES"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<data[i]<<endl;
    }
	return 0;
}

改动了一个地方就过了

#include <bits/stdc++.h>
using namespace std;
inline bool compare(string s1,string s2){
	bool res=true;
	int i,j;
	if(s1.size() > s2.size())//判断位数是否相同,位数多的那个自然就大
	  return !res;
	else if(s1.size() < s2.size())
	  return res;
	else{//当位数相同时,再逐个进行比较
		 return s1<s2;直接return s1<s2;比较就行!!!!
		}
	}
}
int main(){
	int n,i;
	string data[1010];
	cin>>n;
	for(i=0;i<n;i++)
	  cin>>data[i];
   sort(data,data+n,compare);//先排序
    string::size_type idx;
    //网上找的判断字符串所属关系函数............
    for(i=0;i<n-1;i++)
    {
        string::size_type idx;
        idx=data[i+1].find(data[i]);
        if(idx == string::npos )//不存在。//判断一下
        {
            cout << "NO";
            return 0;
        }
    }
    cout<<"YES"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<data[i]<<endl;
    }
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值