地里新农-请到考试中心学习规则
- 积分
- 0
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-1-21
- 最后登录
- 1970-1-1
|
- #include <bits/stdc++.h>
- using namespace std;
- /**
- * If a given string can be permutated to form a palindrome string
- * I - string
- * O - bool, true/false
- */
- int is_palindrome(string &str) {
- unordered_map<char, int> table;
- for (char c : str)
- table[c]++;
- int o=0, e=0;
- for (auto p : table) {
- if (p.second&1) o++;
- else e++;
- }
- return o<2;
- }
- /**
- * Extract all even chars
- * I - string
- * O - chars of first half of the potential palindrome string
- */
- vector<char> half_string(string &str, char &mid) {
- unordered_map<char, int> table;
- for (char c : str)
- table[c]++;
- vector<char> ret;
- for (auto p : table) {
- if (!(p.second&1))
- for (int i=0; i<p.second/2; i++)
- ret.push_back(p.first);
- else
- mid=p.first;
- }
- return ret;
- }
- /**
- * Generate all possible palindrome strings.
- * I - string
- */
- void generate_palindrome(int c, int n, vector<char> &a, string &p, int v[], char &mid) {
- if (c==n) {
- string pr=p;
- reverse(pr.begin(), pr.end());
- if (mid)
- pr=mid+pr;
- pr=p+pr;
- cout<<pr<<endl;
- } else {
- for (int i=0; i<n; i++) if (!v[a[i]]) {
- v[a[i]]=1;
- p[c]=a[i];
- generate_palindrome(c+1, n, a, p, v, mid);
- v[a[i]]=0;
- while (i<n-1 && a[i+1]==a[i]) i++;
- }
- }
- }
- int main(void) {
- string str;
- cin>>str;
- if (is_palindrome(str)) {
- char mid=0;
- auto half=half_string(str, mid);
- sort(half.begin(), half.end());
- int n=half.size();
- int v[256];
- memset(v, 0, sizeof v);
- string palindrome(n, ' ');
- generate_palindrome(0, n, half, palindrome, v, mid);
- }
- }
复制代码 |
|