定義乙個字串的無序度為所有位置後面的字母比該位置的字母小的總數之和。比如"daabec''這個字串的無序度是5,因為d後面有4個位置比它小(aabc),e後面有1個比它小(c),其它位置後面沒有比自己小的。" aacedgg "的無序度為1(e後面有乙個d比它小)。" zwqm "的無序度為6,每個位置後面所有的字母都比它小。
現在你的任務是給定一些字串(只由大寫字母組成),把他們按照無序度從小到大排序,如果無序度一樣,那麼就按照輸入的相對順序排序。
input
單組測試資料。
第一行有兩個整數n(0 < n <= 50)和m (0 < m <= 100),分別表示輸入的字串的長度和字串的個數。
接下來m行,每一行包含乙個長度為n的字串,只由大寫字母組成。
output
輸出m行,表示排序之後的字串。
input示例
10 6
aacatgaagg
ttttggccaa
tttggccaaa
gatcagattt
cccgggggga
atcgatgcat
output示例
cccgggggga
aacatgaagg
gatcagattt
atcgatgcat
ttttggccaa
tttggccaaa
#include #include #include using namespace std;
const int maxn = 60;
const int maxm = 110;
int n;
int m;
int buf[26];
struct node
;node nodes[maxm];
bool cmp(const node &a, const node &b)
else if (a.val == b.val)
return false;
}int main()}}
sort(&nodes[0], &nodes[m], cmp);
for (int i = 0; i < m; i++)
return 0;
}
方法二:樹狀陣列:
思路:對每乙個輸入字串利用樹狀陣列來計算無序度。update()在輸入乙個字元後更新之前輸入的字元中比當前字元大的數量。getsum()得到當前輸入的字元帶來的無序度。
#include #include #include using namespace std;
const int maxn = 60;
const int maxm = 110;
int n;
int m;
struct node
;node nodes[maxm];
int tree[27];
bool cmp(const node &a, const node &b)
else if (a.val == b.val)
return false;
}void update(int k, int v)
}int getsum(int k)
return sum;
}int main()
}sort(&nodes[0], &nodes[m], cmp);
for (int i = 0; i < m; i++)
return 0;
}
51nod 1874 字串排序
1874 字串排序 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 定義乙個字串的無序度為所有位置後面的字母比該位置的字母小的總數之和。比如 daabec 這個字串的無序度是5,因為d後面有4個位置比它小 aabc e後面有1個比它小 c 其它位置後面沒有比自己小的...
1874 字串排序解法心得
現在你的任務是給定一些字串 只由大寫字母組成 把他們按照無序度從小到大排序,如果無序度一樣,那麼就按照輸入的相對順序排序。收起單組測試資料。第一行有兩個整數n 0 n 50 和m 0 m 100 分別表示輸入的字串的長度和字串的個數。接下來m行,每一行包含乙個長度為n的字串,只由大寫字母組成。輸出m...
51nod 1196 字串的數量
超級神題!有n種字元,若此種字元的編號 1 n i 2 n 則他後面可接任意字元。若不是,則他後面接的字元編號至少要是他的兩倍。問長度為m的字串的個數。這道題我只想出了 o n 2 的做法,於是叕只能求助題解。題解的做法和週六第二題有點像,但我並沒有分析出最長鏈的長度小於 log n 這個性質。知道...