题目大意:给一个字符串,要求将它变成一个前向看和后向看一样的字符串,比如"racecar"就是这样一个字符串。现在做法如下,选择两个字母,比如x和y,可以要求将所有的x变成y, 每一个字母的改变都耗费一秒钟。比如:goose,选择把o变成e,会耗时两秒,字符串变成geese。现在给出一个字符串,求将s变成一个要求的字符串耗费的最小时间。
思路:将位置对应的字符链接,整个链接会形成若干棵树。我们要做的统计工作就是保留每棵树上数量最多的节点不变,将其它节点变为该节点的值。代码如下:
#include <string>
#include <iostream>
#include <time.h>
#include <sstream>
#include <math.h>
#include <exception>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <fstream>
#include <stack>
#include <limits>
#include <numeric>
using namespace std;
const int LEN = 27;
int linked[LEN][LEN];
int cnt[LEN];
bool processed[LEN];
class GooseTattarrattatDiv1 {
public:
int getmin(string s) {
int res = 0;
int n = s.length();
for (int i=0; i<n; i++) {
linked[s[i] - 'a'][s[n - i - 1] - 'a'] = 1;
cnt[s[i] - 'a']++;
}
for (int i=0; i<LEN; i++) {
linked[i][i] = 1;
}
for (int i=0; i<LEN; i++) {
if (!processed[i]) {
vector<int> ns;
for (int j=0; j<LEN; j++) {
if (linked[i][j]) {
ns.push_back(cnt[j]);
processed[j] = true;
}
}
sort(ns.begin(), ns.end());
reverse(ns.begin(), ns.end());
for (int j=1; j<ns.size(); j++) {
res += ns[j];
}
}
}
return res;
}
};