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 ...
随机推荐
- 【Android UI设计与开发】10:滑动菜单栏(二)SlidingMenu 动画效果的实现
其实就是在显示菜单栏时,有个动画的效果.代码比较简单,下面进行说明. 1.效果图如下,手机上查看效果更佳 2.代码实现,这里只讲解动画效果的实现,具体代码可在源代码中查看 <1> 先定义一 ...
- 离散化+线段树 POJ 3277 City Horizon
POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...
- 推荐——Monkey《大话 app 测试——Android、iOS 应用测试指南》
<大话移动——Android与iOS应用测试指南> 京东可以预购啦!http://item.jd.com/11495028.html 当当网:http://product.dangdang ...
- Topcoder SRM 619 DIv2 500 --又是耻辱的一题
这题明明是一个简单的类似约瑟夫环的问题,但是由于细节问题迟迟不能得到正确结果,结果比赛完几分钟才改对..耻辱. 代码: #include <iostream> #include <c ...
- 谈谈自己对java的学习看法
从明天起,开始整理java的基础知识,进行巩固学习. 今天呢,谈谈自己的一点想法.很多人不知道java怎么学,学什么,有的是直接在网上找一些视频来看,不懂的地方到处跑群里问,结果效果并不是太好,怎么办 ...
- 【转】【C#】【Thread】Interlocked 轻量级锁
为什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步. 具体使用如下表: Interlocked.Increment(ref value) 数值加一(原子性操作) Inter ...
- shell小结
一 判断 -d 测试是否为目录.-f 判断是否为文件. -s 判断文件是否为空 如果不为空 则返回0,否则返回1 -e 测试文件或目录是否存在. -r 测试当前用户是否有权限读取. -w 测试当前用户 ...
- ant exec
http://ant.apache.org/manual/Tasks/exec.html Exec Description Executes a system command. When the os ...
- c# 技巧之 泛型方法
泛型 指的是编译时不需要指定具体的参数类型,可以在运行时动态地赋予某一种数据类型的机制. 相信很多人对泛型类并不陌生,像Dictionary,List等结构都属于泛型类.有趣的是,一个函数/方法也可 ...
- Javascript设计模式之我见:状态模式
大家好!本文介绍状态模式及其在Javascript中的应用. 模式介绍 定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是控制一个对象状态的条件表达式 ...