https://cn.vjudge.net/problem/20907/origin

长度是 n 的字符串 s,如果它自身是回文数,且它的长度为  的前缀和后缀是 (k - )-回文数,则它被称作 k-回文数。按照定义,任何字符串 (甚至空字符串) 都是 -回文数。

字符串 s 的回文度,被定义为这样的一个最大数 k,满足 s 是 k-回文数。例如,"abaaba" 具有的回文度是  。

给定一个字符串。您的任务是,找出它的全部前缀的回文度之和。

输入
输入数据的第一行,包含了一个非空的字符串,由拉丁字母和数字组成。字符串的长度,不超过 · 。字符串是大小写敏感的。 输出
输出仅有的一个数 — 字符串的全部前缀的回文度之和。

题意

当我们想到用dp思想的时候,问题就转化为了求这个字符串每一个前缀是否是回文串的问题。

字符串hash其实和进制进位有一些相似,我们想到了这一点就可以线性的时间正着求前缀字符串的hash值和前缀字符串的倒转的hash值

当我们求正序前缀的hash的时候,每一次操作就相当于再字符串的最前面插入一个值,所以我们要首先处理出每一位的指数级ans,然后f[i] = f[i - 1] + str[i] * ans;

当我们求逆序前缀的hash值的时候,每一次操作就相当于在字符串的最后插入一个值,整个字符串就要左移一位然后把这个位塞进去 也就是f [i]= f[i - 1] * tmp + str[i];

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
const double eps = 1e-;
const int maxn = 5e6 + ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,tmp,K;
char str[maxn];
int dp[maxn];
ULL f1[maxn],f2[maxn];
int main()
{
scanf("%s",str + );
int l = strlen(str + );
ULL ans = ;
LL sum = ;
dp[] = ;
for(int i = ; i <= l; i ++){
if(str[i] >= '' && str[i] <= ''){
str[i] = str[i] - '';
}else if(str[i] >= 'a' && str[i] <= 'z'){
str[i] = str[i] - 'a' + ;
}else{
str[i] = str[i] - 'A' + ;
}
f1[i] = f1[i - ] * + str[i];
f2[i] = (f2[i - ] + str[i] * ans);
ans *= ;
if(f1[i] == f2[i]){
dp[i] = dp[i >> ] + ;
sum += dp[i];
}
}
Prl(sum); #ifdef VSCode
system("pause");
#endif
return ;
}

CodeForces7D 字符串hash + dp的更多相关文章

  1. HDU 5763 Another Meaning dp+字符串hash || DP+KMP

    题意:给定一个句子str,和一个单词sub,这个单词sub可以翻译成两种不同的意思,问这个句子一共能翻译成多少种不能的意思 例如:str:hehehe   sub:hehe 那么,有**he.he** ...

  2. [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]

    题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...

  3. hdu 4622 Reincarnation 字符串hash 模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...

  4. cf244D. Match &amp; Catch 字符串hash (模板)或 后缀数组。。。

    D. Match & Catch 能够用各种方法做.字符串hash.后缀数组,dp.拓展kmp,字典树.. . 字符串hash(模板) http://blog.csdn.net/gdujian ...

  5. [知识点]字符串Hash

    1.前言 字符串的几大主要算法都多少提及过,现在来讲讲一个称不上什么算法, 但是非常常用的东西——字符串Hash. 2.Hash的概念 Hash更详细的概念不多说了,它的作用在于能够对复杂的状态进行简 ...

  6. 【BZOJ-3555】企鹅QQ 字符串Hash

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1545  Solved: 593[Submit][Statu ...

  7. POJ 1200 字符串HASH

    题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...

  8. LA4671 K-neighbor substrings(FFT + 字符串Hash)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...

  9. 各种字符串Hash函数比较(转)

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...

随机推荐

  1. 了解AutoCAD对象层次结构 —— 4 —— 符号表

    上一小节我们看到了符号表包含了一系列的表(共9个),这些表数量是固定的,用户不能增加新的表,也不能删除现有的表. 符号表名称 符号表功能 Block Table 块表 存储图形数据库中定义的块.此表中 ...

  2. EMM386和UMBPCI 区别

    EMM386和UMBPCI 区别 1,SupportCD-ROM[HIMEM+EMM386NOEMS].支持光驱(EMM386模式)2,SupportCD-ROM[HIMEM+UMBPCI].支持光驱 ...

  3. google 搜索关键字技巧

    google 搜索关键字技巧 来源  https://www.cnblogs.com/qiudabai/articles/9143328.html inurl: 用于搜索网页上包含的URL. 这个语法 ...

  4. 【Gym 100812C】Story of Princess (走完图所有边)

    BUPT2017 wintertraining(15) #7A 题意 给你一个图,n个点m条边,求走遍所有边,至少经过几次点,及输出依次经过的点.n and m (2 ≤ n ≤ 10^5, 1 ≤  ...

  5. python3 fileinput模块

    模块fileinput可以对一个或多个文件的内容所有行进行迭代.遍历等操作: 常用方法: fileinput.input(files=None, inplace=False, backup='', b ...

  6. 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...

  7. mac上安装ta-lib

    Now I am ready to start installing TA-Lib. Generally I followed the steps listed in here. 1. Install ...

  8. IT项目管理——《人月神话》读后感

    这也许是和候红老师的最后的几节课了吧,侯老师是一个很有思想深度,很关心同学的好老师. 一开学就布置了阅读<人月神话>的作业,说实话,我没有看,以我的速度可能2.3个小时就看完了,但是我觉得 ...

  9. Zabbix使用netstat监控会话

    原文链接 TCP的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB:或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是是time_wait值比较高的话 ...

  10. HDU6280 From Tree to Graph

    下午打了湘潭邀请赛,好像缓解了一下北京网络赛超强的自闭感.补一下这个图论题.(补了很久) 题意:给你一颗n节点的树,有m个操作,每次向xi和lca(xi,yi)连边,然后每次zi就是对于新的图在删除每 ...