hdu3613 扩展KMP


#include<stdio.h>
#include<string.h>
#define maxn 501000
char s[maxn],t[maxn];
int next[maxn],extand1[maxn],extand2[maxn];
int ans[],sum[maxn];
void getnext(int *next,char *t)
{
int i,k,j,len=strlen(t);
next[]=len;
i=;
while(i<len-&&t[i]==t[i+])
{
i++;
}
next[]=i;
int a=;
for(k=;k<len;k++)
{
int p=next[a]+a-;
int l=next[k-a];
if(k-+l>=p)
{
int j=p-k+>?p-k+:;
while(k+j<len&&t[k+j]==t[j])
j++;
next[k]=j;
a=k;
}
else next[k]=l;
}
}
void ekmp(char *s,char *t,int *next,int *extand)
{
int i,j,slen=strlen(s),tlen=strlen(t),k;
getnext(next,t);//求next数组
/*
for(i=0;i<tlen;i++)
printf("%d ",next[i]);
printf("\n");
*/
int minlen=slen<tlen?slen:tlen;
int a=;
while(a<minlen&&s[a]==t[a]) a++;
extand[]=a;
a=; for(k=;k<slen;k++)
{
int p=a+extand[a]-;
int l=next[k-a];
if(k-+l>=p)
{
int j=p-k+>?p-k+:;
while(k+j<slen&&j<tlen&&s[k+j]==t[j])
j++;
extand[k]=j;
a=k;
}
else extand[k]=l;
}
/*for(i=0;i<slen;i++)
printf("%d ",extand[i]);
printf("\n");*/
}
int main()
{
int i,j,te;
scanf("%d",&te);
while(te--)
{
for(i=;i<;i++)
scanf("%d",&ans[i]);
scanf("%s",s);
int len=strlen(s);
for(i=;i<len;i++)
{
t[len-i-]=s[i];
if(i==)
sum[i]=ans[s[i]-'a'];
else
sum[i]=sum[i-]+ans[s[i]-'a'];
}
t[len]='\0';
ekmp(s,t,next,extand1);//s做主串
ekmp(t,s,next,extand2);//t做主串 /*for(i=0;i<len;i++)
{
printf("%d ",extand1[i]);
}
printf("\n");
for(i=0;i<len;i++)
{
printf("%d ",extand2[i]);
}
printf("\n");*/ int max=-;
int ret;
for(i=;i<len;i++)
{
ret=;
if(extand1[i]+i==len)
{
ret+=sum[len-]-sum[i-];
}
if(extand2[len-i]==i)//len-i表示t中的位置
{
ret+=sum[i-];
}
if(ret>max)
max=ret;
}
printf("%d\n",max);
}
}
hdu3613 扩展KMP的更多相关文章
- hdu3613 Best Reward 扩展kmp or O(n)求最大回文子串
/** 题目:hdu3613 Best Reward 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:有一个字符串,把他切成两部分. 如果这部 ...
- HDU3613 Best Reward —— Manacher算法 / 扩展KMP + 枚举
题目链接:https://vjudge.net/problem/HDU-3613 Best Reward Time Limit: 2000/1000 MS (Java/Others) Memor ...
- [扩展KMP][HDU3613][Best Reward]
题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 首先了解扩展kmp 扩展K ...
- 扩展KMP题目
hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...
- KMP 、扩展KMP、Manacher算法 总结
一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...
- ACM之路(12)—— KMP & 扩展KMP & Manacher
最近做完了kuangbin的一套关于kmp的题目(除了一道字典树的不会,因为还没学字典树所以先放放),做个总结.(kuangbin题目的链接:http://acm.hust.edu.cn/vjudge ...
- 扩展KMP算法
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- KMP和扩展KMP
文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...
随机推荐
- 二分+DP HDU 3433 A Task Process
HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- 边工作边刷题:70天一遍leetcode: day 85
Find the Celebrity 要点: 这题从solution反过来想比较好:loop through n同时maintain一个candidate:如果cand认识某个i,那么modify c ...
- eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?
对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. eclipse代码里面的代码提示功能默认是关闭的,只有输入“. ...
- awk 和 sed 使用案例
1.模仿wc的行为,统计一个文本文件的文件的字符数.行数.单词数. awk '{numOfChar+=length($0);numOfWord+=NF}END{print numOfChar" ...
- Git之分支创建策略
分支策略:git上始终保持两个分支,master分支与develop分支.master分支主要用于发布时使用,而develop分支主要用于开发使用. 创建master的分支developgit che ...
- 【转】【MMX】 基于MMX指令集的程序设计简介
(一) MMX技术简介 Intel 公司的MMX™(多媒体增强指令集)技术可以大大提高应用程序对二维三维图形和图象的处理能力.Intel MMX技术可用于对大量数据和复杂数组进行的复杂处理,使用MMX ...
- 微软职位内部推荐-UX Designer II
微软近期Open的职位: Search Technology Center Asia (STCA) Position: UX Designer Location: Beijing, China Sea ...
- Vue.js的表格分页组件
转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更 ...
- Linux第八次学习笔记
系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 输入操作是从I/O设备拷贝数据到主存. I/O→主存 输出操作是从主存拷贝数据到I/O设备. 主存→I/O Unix I/O ...
- initWithNibName&initWithCoder &awakeFromNib&UIView常见属性方法
第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第 二.initWithCoder 是一个类在IB中创建 ...