题解:

EX_KMP

网上似乎说kmp也可以,但是我交了一发代码没过

然后标记一下哪一些前缀和后缀会问

暴力枚举拆开了的位置

代码:

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=;
  7. int v[],n,nxt[N],match[N],exnxt[N],exmatch[N];
  8. int L[N],R[N];
  9. char s[N],t[N];
  10. void EXKMP(char s[],char t[],int n,int m)
  11. {
  12. exnxt[]=m;
  13. for (int i=,po=;t[i];i++)
  14. {
  15. int P=po+exnxt[po];
  16. exnxt[i]=max(min(exnxt[i-po],P-i),);
  17. while (i+exnxt[i]<m&&t[exnxt[i]]==t[i+exnxt[i]])exnxt[i]++;
  18. if (i+exnxt[i]>P) po=i;
  19. }
  20. for (int i=,po=;s[i];i++)
  21. {
  22. int P=po+exmatch[po];
  23. exmatch[i]=max(min(exnxt[i-po],P-i),);
  24. while (exmatch[i]<m&&i+exmatch[i]<n&&t[exmatch[i]]==s[i+exmatch[i]])exmatch[i]++;
  25. if (i+exmatch[i]>P) po=i;
  26. }
  27. }
  28. int main()
  29. {
  30. int T;
  31. scanf("%d",&T);
  32. while (T--)
  33. {
  34. memset(exmatch,,sizeof exmatch);
  35. for (int i=;i<;i++) scanf("%d",&v[i]);
  36. scanf("%s",&s);
  37. n=strlen(s);
  38. if (n<)
  39. {
  40. puts("");
  41. continue;
  42. }
  43. for (int i=;i<n;i++)t[n--i]=s[i];
  44. t[n]='\0';
  45. L[]=v[s[]-'a'];
  46. for (int i=;i<n;i++)L[i]=L[i-]+v[s[i]-'a'];
  47. R[n-]=v[s[n-]-'a'];
  48. for (int i=n-;i>=;i--)R[i]=R[i+]+v[s[i]-'a'];
  49. EXKMP(s,t,n,n);
  50. for (int i=;i<n;i++)R[i]=(exmatch[i]==n-i)?R[i]:;
  51. EXKMP(t,s,n,n);
  52. for (int i=;i<n;i++)L[i]=(exmatch[n--i]==i+)?L[i]:;
  53. int ans=;
  54. for (int i=;i<n-;i++)ans=max(ans,L[i]+R[i+]);
  55. printf("%d\n",ans);
  56. }
  57. return ;
  58. }

hdu3613的更多相关文章

  1. hdu3613 Best Reward 扩展kmp or O(n)求最大回文子串

    /** 题目:hdu3613 Best Reward 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:有一个字符串,把他切成两部分. 如果这部 ...

  2. HDU3613 Best Reward —— Manacher算法 / 扩展KMP + 枚举

    题目链接:https://vjudge.net/problem/HDU-3613 Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  3. hdu3613 扩展KMP

    #include<stdio.h> #include<string.h> #define maxn 501000 char s[maxn],t[maxn]; int next[ ...

  4. [扩展KMP][HDU3613][Best Reward]

    题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 首先了解扩展kmp 扩展K ...

  5. [Manacher][HDU3613][Best Reward]

    题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 裸的: 枚举分割点,计算, ...

  6. HDU3613 Manacher//EXKMP//KMP

    http://acm.hdu.edu.cn/showproblem.php?pid=3613 每个字符都有一个权值,将一个字符串分成两半,如果某一半是回文串就把所有的字符权值加起来,否则当0来处理,问 ...

  7. hdu3613 Best Reward【Manacher】

    Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. hdu3613 Best Reward manacher+贪心+前缀和

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

  9. kuangbin专题十六 KMP&&扩展KMP HDU3613 Best Reward(前缀和+manacher or ekmp)

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

随机推荐

  1. SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed()

    问题:Could not get JDBC Connection; nested exception is java.sql.SQLException: com.mchange.v2.c3p0.Com ...

  2. AMS1117稳压模块

    AMS1117有降压稳压的作用.我们使用的是AMS1117-5,输出5V电压. 理论参数: 输出条件 最小值 理论值 最大值 理论电路图: 引脚图:

  3. 九数组分数|2015年蓝桥杯B组题解析第五题-fishers

    九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...

  4. Winform中使用折叠窗口

    使用此处的控件 http://www.codeproject.com/Articles/18401/XPanderControls 注意事项 使用之前需要先添加winform自带的toolStripC ...

  5. 【配置、开发】Spark入门教程[2]

    本教程源于2016年3月出版书籍<Spark原理.机制及应用> ,在此以知识共享为初衷公开部分内容,如有兴趣,请支持正版书籍. Spark为使用者提供了大量的工具和脚本文件,使得其部署与开 ...

  6. 【附3】springboot源码解析 - 构建SpringApplication

    package com.microservice.framework; import org.springframework.boot.SpringApplication; import org.sp ...

  7. yunw

  8. Pro Git读书笔记 - 分支

    Git 分支介绍. 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 在很多版本控制系统中,这是一个略微低效的过程--常常需要完全创 ...

  9. Codeforces Round #223 (Div. 2) E. Sereja and Brackets 线段树区间合并

    题目链接:http://codeforces.com/contest/381/problem/E  E. Sereja and Brackets time limit per test 1 secon ...

  10. python 集合元素添加

    #A new empty set color_set = set() color_set.add("Red") print(color_set) #Add multiple ite ...