hdu3613 extend-kmp
2016-03-14 20:20
267 查看
原题链接
Sample Input
2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
aba
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
acacac
Sample Output
1
6
题意:
输入26个数字,分别表示26个字母的值,输入一个字符串,将这个字符串分成两半,若子串是回文串则其值为各字母之和否则为0,求所能得到的最大值.
思路:
需要枚举扫描一遍extend数组,扫描到的当前位置之前为前半部分T1, 然后用根据extend数组可以判断T1是否是回文。那后半部分T2呢? 刚才是用S去匹配T, 如果要求后缀,只需要用T去匹配S,再得到一个数组extend2即可,根据这个extend2判断后半部分T2是否是回文。
Sample Input
2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
aba
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
acacac
Sample Output
1
6
题意:
输入26个数字,分别表示26个字母的值,输入一个字符串,将这个字符串分成两半,若子串是回文串则其值为各字母之和否则为0,求所能得到的最大值.
思路:
需要枚举扫描一遍extend数组,扫描到的当前位置之前为前半部分T1, 然后用根据extend数组可以判断T1是否是回文。那后半部分T2呢? 刚才是用S去匹配T, 如果要求后缀,只需要用T去匹配S,再得到一个数组extend2即可,根据这个extend2判断后半部分T2是否是回文。
这里写代码片#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> #include <math.h> using namespace std; void EKMP(char s[],char t[],int extend[]) { int next[5555555]; int i,j,p,L; int lens=strlen(s); int lent=strlen(t); next[0]=lent; j=0; while(j+1<lent && t[j]==t[j+1])j++; next[1]=j; int a=1; for(i=2;i<lent;i++) { p=next[a]+a-1; L=next[i-a]; if(i+L<p+1)next[i]=L; else { j=max(0,p-i+1); while(i+j<lent && t[i+j]==t[j])j++; next[i]=j; a=i; } } j=0; while(j<lens && j<lent && s[j]==t[j])j++; extend[0]=j; a=0; for(i=1;i<lens;i++) { p=extend[a]+a-1; L=next[i-a]; if(L+i<p+1)extend[i]=L; else { j=max(0,p-i+1); while(i+j<lens && j<lent && s[i+j]==t[j])j++; extend[i]=j; a=i; } } } const int MAXN=500010; char str1[MAXN],str2[MAXN]; int sum[MAXN]; int v[27]; int next[MAXN]; int extend1[MAXN],extend2[MAXN]; int main() { int T; scanf("%d",&T); while(T--) { for(int i=0;i<26;i++) scanf("%d",&v[i]); scanf("%s",str1); int len=strlen(str1); sum[0]=0; for(int i=0;i<len;i++) { sum[i+1]=sum[i]+v[str1[i]-'a']; str2[i]=str1[len-1-i]; } str2[len]=0; EKMP(str2,str1,extend1); EKMP(str1,str2,extend2); int ans=; for(int i=1;i<len;i++) { int tmp=0; if(i+extend1[i]==len) { tmp+=sum[len-i]; } int pos=len-i; if(pos+extend2[pos]==len) { tmp+=sum[len]-sum[pos]; } if(tmp>ans)ans=tmp; } printf("%d\n",ans); } return 0; }
相关文章推荐
- 微商之路产品个性化
- [uva1588]Kickdown
- iOS点击完按钮 出现 keyboard 并且屏幕上移
- 浅谈 Android MVP
- iPhone5se难逃“酱油”命运?
- 软件测试的平台
- Mac快捷键及命令行指令
- C#成魔之路<14> 网络编程技术(2 )System.Net.Sockets命名空间
- Spring注解@Component、@Repository、@Service、@Controller区别
- java内部类的实例化
- 蓝桥杯常用算法知识点:【递归】n个球中取m个,有多少种取法?
- innobackupex使用注意事项
- 项目1:个人所得税计算器
- 浏览器禁用Cookie,基于Cookie的会话跟踪机制失效的解决的方法
- [bzoj3287] Mato的刷屏计划
- 不错的开源FTP类库
- Roman to Integer
- 【操作系统原理】进程同步
- day19
- HDU1234开门人和关门人