字符排序
题面描述
小杨有 n 个仅包含小写字母的字符串 s1,s2,...,sn,小杨想将这些字符串按一定顺序排列后拼接到一起构成字符串 t。小杨希望最后构成的字符串 t 满足:
- 假设 ti 为字符串 t 的第 i 个字符,对于所有的 j<i 均有 tj≤ti。两个字符的大小关系与其在字母表中的顺序一致,例如 e<g<p<s。
小杨想知道是否存在满足条件的字符串排列顺序。
输入格式
第一行包含一个正整数 T,代表测试数据组数。
对于每组测试数据,第一行包含一个正整数 n,含义如题面所示。
之后 n 行,每行包含一个字符串 si。
输出格式
对于每组测试数据,如果存在满足条件的排列顺序,输出 1,否则输出 0。
样例
3
3
aa
ac
de
2
aac
bc
1
gesp
1
0
0
样例解释
对于第一组测试数据,一种可行的排列顺序为 aa+ac+de,构成的字符串 t 为 aaacde,满足条件。
对于全部数据,保证有 1≤t,n≤100,每个字符串的长度不超过 10。
语言及编译选项
| # | 名称 | 编译器 | 额外参数 | 代码长度限制 |
|---|---|---|---|---|
| 1 | g++ with std11 | g++ |
-O2 -std=c++11 -DONLINE_JUDGE |
65536 B |
cpp
#include <bits/stdc++.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int t,n;
string a[100];
bool bt=true;
void s(int lx,int rx){//快速排序
if(lx>=rx)return;
int l=lx,r=rx;
string temp=a[l];
while(l<r){
while(l<r){
if(a[r][0]<temp[0]){
a[l++]=a[r];
break;
}
r--;
}
while(l<r){
if(a[l][0]>temp[0]){
a[r--]=a[l];
}
l++;
}
}
a[l]=temp;
s(lx,l-1);
s(l+1,rx);
}
bool is(int n){
//先检测每个string 自己内部是否符合 对于所有的 j<i 均有 tj≤ti
for(int i=0;i<n;i++){
for(int j=0;j+1<a[i].length();j++){
if(a[i][j]>a[i][j+1])return false;
}
}
//按每组字符串 首字母排序
s(0,n-1);
for(int i=1;i<n;i++){
if(a[i-1][a[i-1].length()-1]>a[i][0]){
return false;
}
}
//cout<<endl;
return true;
}
int main(int argc, char** argv) {
cin>>t;
for(int i=0;i<t;i++){
cin>>n;
for(int j=0;j<n;j++){
cin>>a[j];
}
cout<<is(n)<<endl;
}
return 0;
}