1. 程式人生 > 其它 >Codeforces Round #761 A. Forbidden Subsequence

Codeforces Round #761 A. Forbidden Subsequence

題目大意

給定一個S序列和一個T序列,T序列只能是abc的排列。現在求字典序最小的S',S'是S的排列且不包含T(此處包含指從S'前往後取,能取滿T則為包含)

分析

思路不難,分情況考慮,如果S中不存在a,b,c任何一個字元,直接將S按字典序排序輸出。如果T序列是b或者c開頭,直接從a開始按字典序輸出。

如果是從a開頭,先輸出所有a,再看第二位,如果第二位是b,則先輸出c,反之先輸出b,剩下的按字典序輸出,打好標記不要輸出重複了。

比賽的時候a題掛了

英文字母居然有26個

程式碼

#include<bits/stdc++.h>
using namespace std;

int
t; int book[100]; int book2[100]; bool cmp(char a,char b) { return b>a; } int main() { cin>>t; while(t--) { memset(book,0,sizeof(book)); memset(book2,0,sizeof(book)); string a,b; cin>>a; cin>>b; int num=a.length();
for(int i=0;i<num;i++) { book[a[i]-'a']++; }//統計是否全部出現 if(book['a'-'a']==0||book['b'-'a']==0||book['c'-'a']==0) { sort(a.begin(),a.end(),cmp); cout<<a<<endl; continue; } if(b[0]=='b'||b[0
]=='c') { for(int i=0;i<26;i++) { if(book[i]==0) continue;//不存在這個字母 int k=book[i]; for(int j=1;j<=k;j++) { cout<<char('a'+i); } } cout<<endl; continue; } if(b[0]=='a')//如果a開頭 { int k=book[0]; book2[0]=1; for(int i=1;i<=k;i++) { cout<<char('a'); }//先把a輸出 if(b[1]=='b') { book2[2]=1; int p=book[2]; for(int i=1;i<=p;i++) { cout<<char('a'+2); }//先把c輸出 } else if(b[1]=='c') { book2[1]=1; int p=book[1]; for(int i=1;i<=p;i++) { cout<<char('a'+1); }//先把b輸出 } for(int i=0;i<26;i++) { if(book[i]==0||book2[i]==1) continue;//不存在這個字母,已經輸出過 int q=book[i]; for(int j=1;j<=q;j++) { cout<<char('a'+i); } } cout<<endl; continue; } } }