Kattis - Sideways Sorting
題目
https://open.kattis.com/problems/sidewayssorting
一般來說我們排序字串都是由左到右,但是本題要我們由上到下來看
輸入第一行包含兩個正整數 $r, c$,表示 row 與 column
接下來有 $r$ 行,每行 $c$ 個字元
最後輸出垂直方向由上到下的穩定排序
並且排序過程當中忽略大小寫
舉例來說
從垂直的方向來看,我們會得到三個字串
接下來排序這幾個字串
最後排回原本的橫向
想法
因為排序的方向是垂直的,我們可以直接以垂直的方式儲存這些字串即可
接下來穩定排序過後在改變輸出的方向即可
至於排序的部分,我們可以先把所有要比較的字串先都轉換成小寫之後再來比較大小
Code
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 
 | #include<iostream>
 #include<algorithm>
 using namespace std;
 string arr[20];
 bool cmp(string p, string q){
 
 for(int i=0 ; i<p.size() ; i++){
 p[i] = tolower(p[i]);
 }
 for(int i=0 ; i<q.size() ; i++){
 q[i] = tolower(q[i]);
 }
 
 if(p != q) return p<q;
 return false;
 }
 int main(){
 int r,c;
 char tmp;
 bool out=false;
 while(cin>>r>>c && (r!=0 && c!=0)){
 
 if(out) cout<<"\n";
 else out=true;
 
 
 for(int i=0 ; i<c ; i++){
 arr[i] = "";
 }
 
 for(int i=0 ; i<r ; i++){
 for(int j=0 ; j<c ; j++){
 
 cin>>tmp;
 arr[j]+=tmp;
 }
 }
 
 stable_sort(arr, arr+c, cmp);
 
 for(int i=0 ; i<r ; i++){
 for(int j=0 ; j<c ; j++){
 
 cout<<arr[j][i];
 }
 cout<<"\n";
 }
 }
 
 return 0;
 }
 
 | 
時間複雜度分析
每筆測資輸入時間複雜度為 $O(rc)$
每筆測資初始化時間複雜度為 $O(rc)$
每筆測資排序時間複雜度為 $O((len(p) + len(q)) \times nlogn)$
每筆測資輸出時間複雜度為 $O(rc)$
每筆測資總時間複雜度約為 $O(rc + nlogn)$ ($len(p) + len(q)$ 很小,可以忽視)