codeforces7D Palindrome Degree(manacher&dp或Hsh&dp)
1 second
256 megabytes
standard input
standard output
String s of length n is
called k-palindrome, if it is a palindrome itself, and its prefix and suffix of length
are(k - 1)-palindromes.
By definition, any string (even empty) is 0-palindrome.
Let's call the palindrome degree of string s such a maximum number k,
for which s is k-palindrome.
For example, "abaaba" has degree equals to 3.
You are given a string. Your task is to find the sum of the palindrome degrees of all its prefixes.
The first line of the input data contains a non-empty string, consisting of Latin letters and digits. The length of the string does not exceed 5·106.
The string is case-sensitive.
Output the only number — the sum of the polindrome degrees of all the string's prefixes.
a2A
1
abacaba
6
题意:
定义回文串的度为length
即前半部分串的度或后半部分的度+1。先再给你一个字符串。
要你求出他全部前缀度的和。
思路:
先用manacher求出以每一个位置为中心最大回文串的长度。
dp[i]记录长度为i的前缀的度。那么dp[i+1]分奇偶用到前面的度即可了。
具体见代码:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=5110000;
int p[maxn<<1],dp[maxn],len;
char buf[maxn],st[maxn<<1];
void init()
{
int i;
len=strlen(buf);
st[0]='$',st[1]='#';
for(i=0;i<len;i++)
st[2*i+2]=buf[i],st[2*i+3]='#';
len=2*len+2;
}
void manacher()
{
int i,id,mx=0;
for(i=1;i<len;i++)
{
p[i]=mx>i? min(mx-i,p[2*id-i]):1;
while(st[i+p[i]]==st[i-p[i]])
p[i]++;
if(i+p[i]>mx)
mx=i+p[i],id=i;
}
}
int main()
{
int i,ans,n;
while(~scanf("%s",buf))
{
ans=0,n=strlen(buf);
init();
manacher();
ans=dp[0]=1;
for(i=1;i<n;i++)
{
if(p[i+2]-1>=i+1)//推断该前缀是否回文。字符串从0開始。 i+2为0到i在p数组对称中心无论回文串长度使是奇数还是偶数的。p[i]-1为最大回文长度
{
if(i&1)
dp[i]=dp[i/2]+1;
else
dp[i]=dp[i/2-1]+1;
}
ans+=dp[i];
}
printf("%d\n",ans);
}
return 0;
}
Hash的做法就比較简单了。
具体见代码:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=5110000;;
unsigned long long H1[maxn],H2[maxn],xp[maxn],ha,hb,x=123;
int dp[maxn],len;
char buf[maxn],rbuf[maxn];
void init()
{
int i;
len=strlen(buf);
H1[len]=H2[len]=0;
xp[0]=1;
for(i=len-1;i>=0;i--)
{
H1[i]=H1[i+1]*x+buf[i];
H2[i]=H2[i+1]*x+rbuf[i];
xp[len-i]=xp[len-i-1]*x;
}
}
unsigned long long getHash(unsigned long long *HS,int s,int L)
{
return HS[s]-HS[s+L]*xp[L];
}
int main()
{
int i,ans;
while(~scanf("%s",buf))
{
ans=0,len=strlen(buf);
for(i=0;i<len;i++)
rbuf[i]=buf[len-i-1];
init();
ans=dp[0]=1;
for(i=1;i<len;i++)
{
ha=getHash(H1,0,i+1);
hb=getHash(H2,len-i-1,i+1);
if(ha==hb)
{
if(i&1)
dp[i]=dp[i/2]+1;
else
dp[i]=dp[i/2-1]+1;
}
else
dp[i]=0;
ans+=dp[i];
}
printf("%d\n",ans);
}
return 0;
}
codeforces7D Palindrome Degree(manacher&dp或Hsh&dp)的更多相关文章
- Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp
题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...
- Codeforces Beta Round #7 D. Palindrome Degree hash
D. Palindrome Degree 题目连接: http://www.codeforces.com/contest/7/problem/D Description String s of len ...
- Ural 1297 Palindrome(Manacher或者后缀数组+RMQ-ST)
1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- Codeforces Beta Round #7 D. Palindrome Degree —— 字符串哈希
题目链接:http://codeforces.com/contest/7/problem/D D. Palindrome Degree time limit per test 1 second mem ...
- Misha and Palindrome Degree
Misha and Palindrome Degree 题目链接:http://codeforces.com/problemset/problem/501/E 贪心 如果区间[L,R]满足条件,那么区 ...
- Palindrome Degree(hash的思想题)
个人心得:这题就是要确定是否为回文串,朴素算法会超时,所以想到用哈希,哈希从左到右和从右到左的key值一样就一定是回文串, 那么问题来了,正向还能保证一遍遍历,逆向呢,卡住我了,后面发现网上大神的秦九 ...
- HDU 4632 Palindrome subsequence (2013多校4 1001 DP)
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...
- Palindrome Degree(CodeForces 7D)—— hash求回文
学了kmp之后又学了hash来搞字符串.这东西很巧妙,且听娓娓道来. 这题的题意是:一个字符串如果是回文的,那么k值加1,如果前一半的串也是回文,k值再加1,以此类推,算出其k值.打个比方abaaba ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
随机推荐
- 【Android 应用开发】Android 平台 HTTP网速測试 案例 API 分析
作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/25996817 工信部规定的网速測试标准 : 除普通网页測速 ...
- Gradle:Gradle入门
一.安装Gradle 1.首先确保你安装的JDK1.5或以上版本号. C:\Users\chengxiang.peng.QUNARSERVERS>java -version java ver ...
- 四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享
一.基于HTTPS协议的12306抢票软件设计与实现--实现效果 二.基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式 三.基于HTTPS协议的12306抢票软件设计与实现-- ...
- hdu 4603 Color the Tree
这道题细节真的非常多 首先能够想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占据和这个点邻接的边 所以,解决这道题的过程例如以下: 预处理阶段: step 1:取随意一个 ...
- UVA - 12230 Crossing Rivers 概率期望
You live in a village but work in another village. You decided to follow the straight path between y ...
- 0x12 队列
感觉和栈那一讲一样简单啊.. poj2259 这个乱搞硬模拟吧...没更新last WA了N次...(叫你懒得写拍) #include<cstdio> #include<iostre ...
- EOJ 3018 查找单词
有一个单词 W,输出它在字符串 S 中从左到右第一次出现的位置 IDX(设 S 中的第 1 个字符的位置为 1).W 只由英文字母组成,S 除英文字母和汉字之外在任何位置(包括头和尾)另有一个或多个连 ...
- 利用JDBC或者事物或者调用存储过程实现往MySQL插入百万级数据
转自:http://www.cnblogs.com/fnz0/p/5713102.html 想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很 ...
- (转)IOS http请求的get 和 post的请求的区别
从表面的意思看get 和 post的区别get就是获取数据,post就是发送数据.这个是误区.其实两者都可以的,在IOS向服务器发送请求里面可以带参数. 那么这些误区是怎么出现的呢?先看看一下对htt ...
- SQL Server 计算汉字笔画函数
create function [dbo].[fun_getbh](@char nchar(2)) returns int as begin return( case when unicode(@ch ...