2019 年百度之星·程序设计大赛 - 初赛二
傳送門:
[1]:HDU
[2]:bestcoder
B.度度熊與排列(思維)
?題意
有一個(gè)數(shù)組 p,p 中包含的數(shù)為 1~m 的全排列,一個(gè)含 m 個(gè)字符的串 s;
在 s 上有一個(gè)操作,對(duì)于 s 中的第 i 個(gè)位置的字符,放到 p[ i ] 位置,構(gòu)成一個(gè)新串 t;
即?si=tpisi=tpi;
給你 2n 個(gè)串,每?jī)蓚€(gè)串為一組,前一個(gè)串表示原串 s,后一個(gè)串表示經(jīng)過(guò) p 映射后的新串 t;
求是否存在某個(gè) 1~m 的全排列,使得這 n 組串都可以經(jīng)過(guò) p 由 s 變?yōu)?t;
如果存在,輸出字典序最小的那組,如果不存在,輸出 -1;
?思路
就s->t可以對(duì)應(yīng)實(shí)現(xiàn)而言
每個(gè)s串的每個(gè)位置的字母,與每個(gè)t串的對(duì)應(yīng)位置的字母是相同的
例如
? s串 t串?
abcdda addcba
azxcvv vvcxza
s串每個(gè)位置字母
? ?1? ? 2 3 4 5 6
a b c d d a
a z x c v v
t串每個(gè)位置字母
? ?1? ? 2 3 4 5 6
a d d c b a
v v c x z a
所以s與t位置對(duì)應(yīng)
1->6,2->5,3->4,4->3,5->2,6->1
為了方便查找,我們可以將s串每一列按字典序排序,t串每一列按字典序排序
于是變成
s串
? ?1? ? 6 2 3 4 5
a a b c d d
a v z x c v
t串
? ?6 ? 1 5 4 3 2
a a b c d d
a v z x c v
排序之后s的每一列,與t的每一列應(yīng)該是完全相同的,
s與t所對(duì)應(yīng)的序號(hào),就是對(duì)應(yīng)的位置
?代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 pair<string,int> p1[55],p2[55]; 5 string s[25],t[25]; 6 7 int main() 8 { 9 int T; 10 cin>>T; 11 while(T--) 12 { 13 int n,m; 14 cin>>n>>m; 15 for(int i=1;i<=n;i++) 16 cin>>s[i]>>t[i]; 17 18 for(int j=0;j<m;j++) 19 { 20 string x,y; 21 for(int i=1;i<=n;i++) 22 { 23 x+=s[i][j]; 24 y+=t[i][j]; 25 } 26 p1[j].first=x,p2[j].first=y; 27 p1[j].second=j+1,p2[j].second=j+1; 28 } 29 sort(p1,p1+m); 30 sort(p2,p2+m); 31 32 int index[55]; 33 bool flag=true; 34 for(int i=0;i<m;i++) 35 { 36 if(p1[i].first!=p2[i].first) 37 { 38 puts("-1"); 39 flag=false; 40 break; 41 } 42 index[p1[i].second]=p2[i].second; 43 } 44 if(!flag) 45 continue; 46 for(int i=1;i<=m;i++) 47 { 48 if(i!=1) 49 printf(" %d",index[i]); 50 else 51 printf("%d",index[i]); 52 } 53 puts(""); 54 } 55 } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/MMMinoz/p/11379607.html
總結(jié)
以上是生活随笔為你收集整理的2019 年百度之星·程序设计大赛 - 初赛二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 清空ARP缓存
- 下一篇: 2019 年百度之星·程序设计大赛 -