标签:style algo 一个 script bsp ems 现在 nec BMI
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 4345 Accepted Submission(s): 1791
题意:
给定一个字符串,以及每个字母拥有的价值。现在要把这个字符串切成两半,如果子串是回文,那么就可以加上这个子串的字符价值之和,如果不是回文这个子串的价值就是0.
现在要求两个子串相加的最大价值。
思路:
用Manacher我们可以处理出,以某个节点$i$为中心时的回文串长度, 即$p[i]-1$。
如果暴力枚举分割点,如果子串的中心的$p[i] - 1$正好是子串的长度,那么说明这个子串是一个回文串。
这里由于我们要算每个字符的价值之和,可以预处理前缀和。
对于偶数长度的串和奇数长度的串分别求对应的价值。
1 //#include<bits/stdc++> 2 #include<stdio.h> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 #include<stdlib.h> 7 8 #define LL long long 9 #define ull unsigned long long 10 #define inf 0x3f3f3f3f 11 12 using namespace std; 13 14 int t; 15 int val[30]; 16 const int maxlen = 5e5 + 5; 17 char s[maxlen], s_new[maxlen * 2]; 18 int s_val[maxlen], p[maxlen * 2]; 19 20 int init() 21 { 22 int len = strlen(s + 1); 23 s_new[0] = ‘$‘; 24 s_new[1] = ‘#‘; 25 int j = 2; 26 for(int i = 1; i <= len; i++){ 27 s_new[j++] = s[i]; 28 s_new[j++] = ‘#‘; 29 } 30 s_new[j] = ‘\0‘; 31 return j; 32 } 33 34 void manacher() 35 { 36 int len = init(); 37 int id, mx = 0; 38 39 for(int i = 1; i < len; i++){ 40 if(i < mx)p[i] = min(p[2 * id - i], mx - i); 41 else p[i] = 1; 42 while(s_new[i - p[i]] == s_new[i + p[i]])p[i]++; 43 if(mx < i + p[i]){ 44 id = i; 45 mx = i + p[i]; 46 } 47 } 48 } 49 50 int main() 51 { 52 scanf("%d", &t); 53 while(t--){ 54 memset(p, 0, sizeof(p)); 55 for(int i = 0; i < 26; i++){ 56 scanf("%d", &val[i]); 57 } 58 scanf("%s", s + 1); 59 60 int len = strlen(s + 1); 61 for(int i = 1; i <= len; i++){ 62 s_val[i] = s_val[i - 1] + val[s[i] - ‘a‘]; 63 } 64 manacher(); 65 // cout<<s_new<<endl; 66 // for(int i = 0; i <= len * 2; i++){ 67 // cout<<p[i]<<" "; 68 // } 69 // cout<<endl; 70 71 int ans = 0; 72 for(int i = 1; i < len; i++){ 73 int tmp = 0; 74 if(p[i + 1] - 1 == i){ 75 if(i % 2){ 76 tmp += s_val[i / 2] * 2 + val[s[(i + 1) / 2] - ‘a‘]; 77 } 78 else{ 79 tmp += s_val[i / 2] * 2; 80 } 81 } 82 if(p[i + len + 1] - 1 == len - i){ 83 if((len - i) % 2){ 84 tmp += (s_val[i + (len - i) / 2] - s_val[i]) * 2 + val[s[i + (len + 1- i) / 2] - ‘a‘]; 85 } 86 else{ 87 tmp += (s_val[i + (len - i) / 2] - s_val[i]) * 2; 88 } 89 } 90 ans = max(ans, tmp); 91 } 92 printf("%d\n", ans); 93 } 94 95 }
标签:style algo 一个 script bsp ems 现在 nec BMI
原文地址:https://www.cnblogs.com/wyboooo/p/10259959.html