WA0 两个样例均可过

题目:


代码:

#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
char p[30];
int n;
string a[50005];
bool cmp(string a,string b){
	if(a.size()==b.size()){
		int len=a.size();
		for(int i=0;i<len;i++){
			int l,r;
			for(int j=1;j<=26;j++){
				if(p[j]==a[i]){
					l=j;
					break;
				}
			}
			for(int j=1;j<=26;j++){
				if(p[j]==b[i]){
					r=j;
					break;
				}
			}
			if(l>r)return 0;
			else if(l<r)return 1;
		}
	}
	return a.size()<b.size();
}
int main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	for(int i=1;i<=26;i++)cin>>p[i];
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(&a[1],&a[n+1],cmp);
	for(int i=1;i<=n;i++)cout<<a[i]<<endl;
	i_ak ioi;
}

@王建力 @2345安全卫士

最后再判断长度,一开始不用管长度相不相同

只有在一个字符串是另一个字符串的子串时才比较大小。

??? @邓雅曦 啥意思?

@黄飞栋 但是字典序不是长度小的越小吗?

就是先按字典序排。排到最后还没有退出再比较大小。

@邓雅曦 为什么?

字典序就是这么排的呀,不然答案过不了

@邓雅曦 所以如果cmp判断不了直接比较大小?

两个字符串先遍历到大小就小的字符串结尾,i<=min(a.size(),b.size())
如果中间遍历的时候两个si不一样就直接返回,留下来说明前面都一样就比较大小。

@邓雅曦 啥意思?先比较什么再诸位比较?

打错了,直接诸位比较

1 个赞

@邓雅曦 不是先比较长短吗?

1 个赞

不是,先按字典序排。

@邓雅曦 o谢谢我试试

我的cmp就是这样实现的:

bool cmp(string a,string b){
    for(int i=0;i<min(a.size(),b.size());++i)if(a[i]!=b[i])return m[a[i]]<m[b[i]];
    return a.size()<b.size();
}

@邓雅曦 啥意思?

abdudje
owj
z
正确排法,按原来的字典是这么排的。

谢谢 AC 了,@栗子酱 @稻叶昙 关帖