题意:给你一个字符串问切一刀的最大价值。会给出26个字母的价值,而如果你切出来的一个字符串是回文串,则价值为回文串所有字母的和,否则为0.求最大价值。值得注意的是,字母价值可能为负数。
思路:可以想到马拉车算法求出P数组,然后暴力枚举。先预处理出字母价值的前缀和然后再去暴力。暴力过程中还是有很多细节,比如你前和后两个字符串都是回文如何判断,前是回文,后不是回文,前不是回文,后是回文,前后都不是回文。四种情况都要想好确切思路去判断。我是先遍历,找出哪个后缀是回文,然后在去暴力枚举,注意之后操作都在text串中而不是原串。分类讨论一切都在代码中。
#include <iostream> #include <string> #include <cstring> #include <algorithm> #include <cstdio> #include <cctype> #include <queue> #include <stdlib.h> #include <cstdlib> #include <math.h> #include <set> #include"queue" #include <vector> #define inf 107374182 #define M 10010001 #define ll long long #define PII pair<int,int> using namespace std; const int maxn=2000110; char a[maxn],text[maxn]; int P[maxn]; int b[100]; int c[maxn]; int sum[maxn]; void pre_treat(){ int len = strlen(a); for(int i=0;i<len;i++){ text[i*2] = '#'; text[i*2+1] = a[i]; } text[len*2]='#';text[len*2+1]='