This problem was solved using some ideas from GeeksforGeeks.
The longest palindrome string would be reverse itself + itself.
We need to find the max prefix of the new string.
The shortest palindrome would be reversed.substr(0, size - len prefix) + orig.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
/*
Given a string S, you are allowed to convert it to a palindrome by adding
characters in from of it. Find and return the shortest palindrome you
can find by performing this transformation.
For example:
Given "aacecaaa", return "aaacecaaa"
Given "abcd", return "dcbabcd"
*/
string shortestPalindrome(string s) {
string t = s;
reverse(t.begin(), t.end());
string tmp = t + '#' + s;
int n = tmp.size();
vector<int> dp(n, 0);
for(int i = 1; i <= tmp.size(); ++i) {
int j = dp[i-1];
while(j > 0 && (tmp[i] != tmp[j])) {
j = dp[j-1];
}
dp[i] = (j + (tmp[i] == tmp[j]));
}
return t.substr(0, s.size() - dp[tmp.size() - 1]) + s;
}
int main(void) {
cout << shortestPalindrome("abc") << endl;
}