题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613
题目大意:
题目大意就是将字符串s分成两部分子串,
若子串是回文串则需计算价值,否则价值为0,求分割字符串s能获得的最大价值。
解题思路:
用manacher算法计算出p[i],每次计算p[i]是顺便计算一下这段回文串
是否能到达边界,若能则计算出前缀或者后缀的结束位置,标记起来。//还有之前数组开1e6+5教C++是错的,改成2e6+5就对了,不觉明历。。。。
代码(复杂点的)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=2e6+5; 7 const int INF=0x3f3f3f3f; 8 9 int len1,len2; 10 int p[N],sum[N],val[N],pre[N],hou[N]; 11 char s[N],str[N]; 12 13 void init(){ 14 str[0]='$'; 15 str[1]='#'; 16 for(int i=0;i<len1;i++){ 17 str[i*2+2]=s[i]; 18 str[i*2+3]='#'; 19 } 20 len2=len1*2+2; 21 str[len2]='