CSES Problem Set Palindrome Reorder Solution
Given a string, your task is to reorder its letters in such a way that it becomes a palindrome (i.e., it reads the same forwards and backwards).
Input
The only input line has a string of length consisting of characters A–Z.
Output
Print a palindrome consisting of the characters of the original string. You may print any valid solution. If there are no solutions, print "NO SOLUTION".
Constraints
Input:
Output:
Input
The only input line has a string of length consisting of characters A–Z.
Output
Print a palindrome consisting of the characters of the original string. You may print any valid solution. If there are no solutions, print "NO SOLUTION".
Constraints
Input:
AAAACACBA
Output:
AACABACAA
#include <bits/stdc++.h>
using namespace std;
#define int long long int#define F first#define S second#define pb push_back#define si set <int>#define vi vector <int>#define pii pair <int, int>#define vpi vector <pii>#define vpp vector <pair<int, pii>>#define mii map <int, int>#define mpi map <pii, int>#define spi set <pii>#define endl "\n"#define sz(x) ((int) x.size())#define all(p) p.begin(), p.end()#define double long double#define que_max priority_queue <int>#define que_min priority_queue <int, vi, greater<int>>#define bug(...) __f (#__VA_ARGS__, __VA_ARGS__)#define print(a) for(auto x : a) cout << x << " "; cout << endl#define print1(a) for(auto x : a) cout << x.F << " " << x.S << endl#define print2(a,x,y) for(int i = x; i < y; i++) cout<< a[i]<< " "; cout << endl
inline int power(int a, int b){ int x = 1; while (b) { if (b & 1) x *= a; a *= a; b >>= 1; } return x;}
template <typename Arg1>void __f (const char* name, Arg1&& arg1) { cout << name << " : " << arg1 << endl; }template <typename Arg1, typename... Args>void __f (const char* names, Arg1&& arg1, Args&&... args){ const char* comma = strchr (names + 1, ','); cout.write (names, comma - names) << " : " << arg1 << " | "; __f (comma + 1, args...);}
const int N = 200005;
bool cmp(pair<int,int>a,pair<int,int>b){ if(a.first==b.first)return a.second<b.second; else return a.first>b.first;}
void solve() {
string s;cin>>s;int odd=0;int ch=-1;vector<pair<int,int>>v(26);for(int i=0; i<26; i++)v[i].second=i;for(auto c:s){ v[c-'A'].first++;}for(auto i:v)if(i.first%2){odd++;ch=i.second;}if(odd>1)cout<<"NO SOLUTION"<<endl;else{ sort(v.begin(),v.end(),cmp); string ans="",anss=""; // print(v); for(int i=0; i<26; i++){ if(v[i].first%2==0){ ans+=string(v[i].first/2,('A'+v[i].second)); // v[i]--; } else{ v[i].first--; if(v[i].first>0) ans+=string(v[i].first/2,('A'+v[i].second)); } } for(int i=0; i<26; i++){ if(v[i].first%2==0){ anss+=string(v[i].first/2,('A'+v[i].second)); // v[i]--; } else{ if(v[i].first>0) anss+=string(v[i].first/2,('A'+v[i].second)); } } if(ch!=-1) ans+='A'+ch; reverse(anss.begin(),anss.end()); ans+=anss; cout<<ans<<endl;}
}
int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
clock_t z = clock();
int t = 1;// cin >> t; while (t--) solve();
return 0;}
0 Comments
If you have any doubts/suggestion/any query or want to improve this article, you can comment down below and let me know. Will reply to you soon.