1、字符串解析将字符串看成不同的字符切片,切片不可重复,按字母序输出所有切片(每个切片一行)
输入: aaabbcaaabaa
输出:
aa
aaa
b
bb
c
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int i = 1, beg = 0;
set<string> se;
while (i < s.size()) {
while (i < s.size() && s[i] == s[i-1]) i++;
int len = i-beg;
se.insert(s.substr(beg, len));
beg = i;
i++;
}
for (auto i : se)
cout << i << endl;
return 0;
}
2、哈弗曼树求最小带权路径长度
输入:
4
1 1 1 1
输出: 8
输入:
4
22 5 6 3
输出: 76
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
priority_queue<int,vector<int>, greater<int>> q; // 小根堆
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
q.push(x);
}
int ans = 0;
while(q.size() > 1) {
// 每次从队列中取最小的两个元素 合并成一个新元素,加入队列
int a1 = q.top();
q.pop();
int a2 = q.top();
q.pop();
ans += a1;
ans += a2;
q.push(a1 + a2);
}
cout << ans << endl;
}