题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0。问最多能获得多少价值?

分析 : 有两种做法,第一种是拓展KMP正反跑两次或者Manacher

①如果我们用原串去和反转串( 即将原串反转 )跑一次拓展KMP得到的 extend 能够帮助我们得到原串前缀的某一段是否是回文串,仅当 extend[i] = 整个后缀长度,而用反转串去和原串跑一次拓展KMP得到的另一个 extend 能够帮助我们得到原串的某个后缀是否是回文串,借助这两个 extend 我们就能得到每一个字符作为分割点时候的价值了,当然提前处理原串的前缀价值和会快速更多

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
;
int Next[maxn], moL;
void GetNext(char * mo)
{
    Next[] = moL;
    int a, p;
    , j = -; i < moL; i++, j--){
         || i + Next[i - a] >= p){
            ) p = i, j = ;

            while (p < moL && mo[p] == mo[j]) p++, j++;

            Next[i] = j;
            a = i;
        } else Next[i] = Next[i - a];
    }
}

void GetExtend(char * S, char *mo, int * ext)
{
    GetNext(mo);
    int a, p;
    int strL = moL;
    , j = -; i < strL; i++, j--){
         || i + Next[i - a] >= p){
            ) p = i, j = ;

            while (p < strL && j < moL && S[p] ==  mo[j])
                p++, j++;

            ext[i] = j;
            a = i;
        } else ext[i] = Next[i - a];
    }
}

];

inline void GetSum(char * mo)
{
    memset(sum, , sizeof(sum));
    sum[] = val[mo[]-'a'];
    ; i<moL; i++){
        sum[i] += sum[i-] + val[mo[i]-'a'];
    }
}

char mo[maxn], Rmo[maxn];
int extend[maxn], Rextend[maxn];

int main(void)
{
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        ; i<; i++)
            scanf("%d", &val[i]);
        scanf("%s", mo);
        memcpy(Rmo, mo, sizeof(mo));
        moL = strlen(mo);
        std::reverse(Rmo, Rmo+moL);

        GetSum(mo);
        GetExtend(Rmo, mo, extend);///用原串跑反转串
        GetExtend(mo, Rmo, Rextend);///用反转串跑原串

        ;
        ; i<moL; i++){
            ;
            ];///这里的关系可能有点烦,拿个例子推一推就行了
            ]-sum[moL-i-];
            ans = max(tmp, ans);
        }

        printf("%d\n", ans);
    }
    ;
}

②如果用Manacher的话就每一个字符串去跑一下最长回文算法,然后和①一样的处理即可,当然代码会更简单,而且时间复杂度上也比①优

HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )的更多相关文章

  1. 拓展KMP求回文串

    题目:hdu3613: 题意:有26字母对应的价值,然后给出以个串,把它分成两段字串,如果字串是回文串,串的价值就是每个字符和,不是就为0.求最大价值. 博客 分析:拓展KMP的应用求回文字串. #i ...

  2. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  3. Palindrome - URAL - 1297(求回文串)

    题目大意:RT   分析:后缀数组求回文串,不得不说确实比较麻烦,尤其是再用线段数进行查询,需要注意的细节地方比较多,比赛实用性不高......不过练练手还是可以的.   线段数+后缀数组代码如下: ...

  4. 马拉车,O(n)求回文串

    马拉车,O(n)求回文串 对整个马拉车算法步骤做个总结: 第一步:将每个原字母用两个特殊字符包围如: aaa --> #a#a#a# abab -->#a#b#a#b 同时可以由这个翻倍的 ...

  5. 2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)

    2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每 ...

  6. HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

    题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...

  7. HDU 4632 Palindrome subsequence(区间DP求回文子序列数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 题目大意:给你若干个字符串,回答每个字符串有多少个回文子序列(可以不连续的子串).解题思路: 设 ...

  8. hdu 3294 manacher 求回文串

    感谢: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/ O(n)求给定字符串的以每个位置为中心的回文串长度. 中心思想:每次计算位 ...

  9. 3676: [Apio2014]回文串 求回文串长度与出现次数的最大值

    「BZOJ3676」[Apio2014] 回文串   Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所 ...

随机推荐

  1. 20191110 Spring Boot官方文档学习(4.1)

    4. Spring Boot功能 4.1.Spring应用 便捷的启动方式: public static void main(String[] args) { SpringApplication.ru ...

  2. myBatis 基于javaBean配置

    MyBatis的持久化解决方案是将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句, 无须关注底层的JDBC操作,就可以以面向对象的方式来进行持久化层操作.底层数据库连接的获取, ...

  3. 第五周实验报告&学习总结

    实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 1.已知字符串:"this is a test of java".按要求执 ...

  4. JDK8中接口的新特性

    在JDK8环境中,接口中的方法不再是只能有抽象方法,还可以有静态方法和default方法.实现类只需要实现它的抽象方法即可,JDK8中的接口有愈发向抽象类靠拢的感觉. 关于静态方法和默认方法作如下简述 ...

  5. 递归法求组合数C(m,n)

    假设这样一个数组: 1 2 3 4 5 n=5 若 m=3 也就是要求C(3,5) 首先先选第一个数 1 那么剩下的工作就是在2-5之间选择2个数 如果我们没有选择第一个数 选第二个数2 那么剩下的工 ...

  6. mysql中的范式

    范式 范式:Normal Format,是一种离散数学中的知识,是为了解决数据的存储与优化的问题:保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余.范 ...

  7. 傻傻分不清?Integer、new Integer() 和 int 的面试题

    这篇有意思: 基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Intege ...

  8. 排列perm HYSBZ - 1072(状压dp/暴力)

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...

  9. Android数据库使用指南(下)

    前言 上面已经说了,对表进行修改,其实就是对数据库进行升级,删除表也算升级啊,反正就是发生变化,数据库就需要升级. 所以老实说其实有个地方决定了数据库的版本 public class DBHelper ...

  10. switch语句小练习

    java有两钟选择判断语句,分别是if else和switch case语句. 下面我们做一个switch case语句的练习. // 定义一个扫描器 Scanner sacnner = new Sc ...