Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
一个简单的bp:
假设已有一段S已经获得其的symmetric长度为K,那么其后再加一个字符组成一个新的串的symmetric长度只有可能+1或+2或者重算(具体自己画个图思考一下)。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1005;
int bp[maxn];
int main() {
memset(bp, 0, sizeof(bp));
string str;
getline(cin, str);
// cout << str << endl;
int cnt = 0;
bool in_plus1_state = true;
for(int i = 0; i < str.size(); ++i) {
if (i == 0) {
bp[i] = cnt = 0;
continue;
}
if (str[i] == str[i-(cnt + 1)]) { // 加 1 的那种状况
bp[i] = bp[i-1] + 1;
in_plus1_state = true;
}
if (in_plus1_state && (i - (cnt + 2) >= 0 && str[i] == str[i - (cnt + 2)])) {
bp[i] = bp[i-1] + 2;
in_plus1_state = false;
} else if (!in_plus1_state) {
if (str[i] == str[i - (cnt + 2)]) {
bp[i] = bp[i-1] + 2;
in_plus1_state = false;
} else {
if (str[i] == str[i-1]) {
bp[i] = 1;
in_plus1_state = true;
} else if (str[i] == str[i-2]) {
bp[i] = 2;
in_plus1_state = false;
}
}
}
cnt = bp[i];
}
int maxbp = 0;
for(int i = 0; i < str.size(); ++i) {
maxbp = max(maxbp, bp[i]);
// printf("%d ", bp[i]);
}
// printf("\n");
cout << maxbp + 1 << endl;
return 0;
}