Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <bits/stdc++.h>
- using namespace std;
- const int N = 2006;
- int dp[N][N];
- pair<int,int> bck[N][N]; // backtracking
- string s;
- string palindrome(int l, int r){
- if(l == r){
- return string(1, s[l]);
- }
- if(l+1 == r){
- if(s[l] == s[r]){
- return string(2, s[l]);
- }
- else{
- return "";
- }
- }
- int ll = bck[l][r].first;
- int rr = bck[l][r].second;
- string ret = palindrome(ll, rr);
- if(ll == l+1 and rr == r-1){
- assert(s[l] == s[r]);
- return string(1,s[l]) + ret + string(1, s[r]);
- }
- return ret;
- }
- int main () {
- bool done = false;
- while (!done) {
- getline(cin,s);
- if (s == "") {
- done = true;
- break;
- }
- int n = s.size();
- for (int i = 0; i < n; ++i) {
- dp[i][i] = 1;
- bck[i][i] = make_pair(-1, -1);
- }
- for (int len = 2; len <= n; ++len) {
- for (int i = 0; i + len < n + 1; ++i) {
- int j = i + len - 1;
- if (s[i] == s[j] and len == 2) {
- dp[i][j] = 2;
- bck[i][j] = make_pair(-1, -1);
- }
- else if (s[i] == s[j]) {
- bck[i][j] = make_pair(i+1, j-1);
- dp[i][j] = dp[i+1][j-1] + 2;
- }
- else {
- if(dp[i+1][j] > dp[i][j-1]){
- bck[i][j] = make_pair(i+1, j);
- }else{
- bck[i][j] = make_pair(i, j-1);
- }
- dp[i][j] = max (dp[i + 1][j], dp[i][j - 1]);
- }
- }
- }
- cout << dp[0][n-1] << "\n";
- cout << palindrome(0, n - 1);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement