/** 题目:hdu3613 Best Reward 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:有一个字符串,把他切成两部分。 如果这部分是回文串,那么他的值为所有字母的权值和。否则这部分值为0;这两部分的值和为该切法的权值。 求最大的切法的权值。 思路: 如果能够判断[0,i],[i,n-1]是一个回文串(0<=i<n)那么就可以枚举i,计算切割位置为i时候两部分的贡献和。 取最大的。 利用O(n)的算法求最长回文子串的做法获得f[i];表示以第i个字符为中心的最长回文子串的长度; 就可以获得l[i],r[i]; l[i]=1表示[0,i]是一个回文串.r[i]=1表示[i,n-1]是一个回文串。 */ #include <cstdio> #include <cstring> #include <algorithm> #include<set> #include <iostream> #include <vector> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 1e6+10;///给定的长度 char s[maxn*2], t[maxn];///要乘以2,因为构造了'*' int f[maxn*2];///令f[i] 表示以第i个字符为中心的最长回文子串的长度 int sum[maxn*2], w[30]; int l[maxn*2], r[maxn*2];///l[i]=1表示[0,i]是一个回文串.r[i]=1表示[i,n-1]是一个回文串。 int longest(char *a)///最长回文子串 { int z = 0; for(int i = 0; a[i]!='