题目链接:

http://codeforces.com/problemset/problem/7/D

D. Palindrome Degree

time limit per test1 second
memory limit per test256 megabytes
#### 问题描述
> 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

题意

假设前缀prei是k-回文串(k=a[i])。则求ans=sigma(a[i])。

题解

用manacher算法处理出最左端为第一个字母的所有回文串,然后dp一下。

dp[i]表示长度为i的前缀是k-回文串(k=dp[i])。 则dp[i]=dp[i/2]+1;

ans=sigma(dp[i]);

代码

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=1e7+10; char s[maxn];
//P[i]表示把回文串折叠起来的长度
//mx表示当前计算出来的回文串往右延伸的最远端
//d表示贡献出mx的串的回文中心
int P[maxn],mx,id,n;
LL dp[maxn]; LL solve(){
LL ret=0;
int len=strlen(s+1);
n=len*2+1;
s[0]='$',s[n]='#',s[n+1]='\0';
for(int i=len*2;i>=1;i--){
if(i&1) s[i]='#';
else s[i]=s[i/2];
}
// puts(s);
clr(dp,0);
mx=1,id=0;
for(int i=1;i<=n;i++){
//优化的核心,画画图比较好理解,j=2*id-i表示i关于id对称的点
P[i]=mx>i?min(mx-i,P[2*id-i]):1;
int k=i+P[i];
while(s[k]==s[2*i-k]) k++,P[i]++;
if(2*i-k==0&&i>1){
// bug(i);
int l=P[i]-1;
dp[l]=dp[l/2]+1;
ret+=dp[l];
}
if(k>mx){
mx=k;
id=i;
}
}
return ret;
} int main() {
scf("%s",s+1);
LL ans=solve();
prf("%I64d\n",ans);
return 0;
} //end-----------------------------------------------------------------------

Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp的更多相关文章

  1. Codeforces Beta Round #7 D. Palindrome Degree hash

    D. Palindrome Degree 题目连接: http://www.codeforces.com/contest/7/problem/D Description String s of len ...

  2. Codeforces Beta Round #7 D. Palindrome Degree —— 字符串哈希

    题目链接:http://codeforces.com/contest/7/problem/D D. Palindrome Degree time limit per test 1 second mem ...

  3. Codeforces Beta Round #51 D. Beautiful numbers(数位dp)

    题目链接:https://codeforces.com/contest/55/problem/D 题目大意:给你一段区间[l,r],要求这段区间中可以整除自己每一位(除0意外)上的数字的整数个数,例如 ...

  4. Codeforces Beta Round #96 (Div. 2) E. Logo Turtle dp

    http://codeforces.com/contest/133/problem/E 题目就是给定一段序列,要求那个乌龟要走完整段序列,其中T就是掉头,F就是向前一步,然后开始在原点,起始方向随意, ...

  5. Codeforces Beta Round #96 (Div. 1) C. Logo Turtle —— DP

    题目链接:http://codeforces.com/contest/132/problem/C C. Logo Turtle time limit per test 2 seconds memory ...

  6. Codeforces Beta Round #17 C. Balance (字符串计数 dp)

    C. Balance time limit per test 3 seconds memory limit per test 128 megabytes input standard input ou ...

  7. Codeforces Beta Round #96 (Div. 1) C. Logo Turtle DP

    C. Logo Turtle   A lot of people associate Logo programming language with turtle graphics. In this c ...

  8. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  9. Codeforces Beta Round #62 题解【ABCD】

    Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...

随机推荐

  1. MongoDB4.0在windows10下的安装与服务配置

    本地安装及网页测试 在官网下载最新的安装文件 下载地址 : https://www.mongodb.com/download-center#community 可以在MongoDB官网选择Commun ...

  2. php 实现重定向的三种方式

    header()函数; header('location:http://www.baidu.com'); meta标签; echo '<meta http-equiv="refresh ...

  3. Home Assistant系列 -- 基于树莓派安装并设置自启动

    Home Assistant 是当前智能家居最火热的开源DIY 软件,之前的文章  智能家居系统 Home Assistant 系列 --介绍篇  已经详细介绍过了,这里就不详细介绍了,今天介绍 如何 ...

  4. mitmproxy 在windows上的使用

    mitmproxy 是一个中间件代理, 结合python使用 安装  pip install mitmproxy 在windows上没有mitmproxy 所以只要用mitmdump和mitmwdb ...

  5. 解决「matplotlib 图例中文乱码」问题

    在学习用 matplotlib 画图时遇到了中文显示乱码的问题,在网上找了很多需要修改配置的方法,个人还是喜欢在代码里修改. 解决方法如下: 在第2.3行代码中加上所示代码即可. import mat ...

  6. .Net 两个对像之间的映射 (一 )

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 20155334 2016-2017-2 《Java程序设计》第十周学习总结

    20155334 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 1.计算机网络概述 (1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以 ...

  8. WPF MVVM从入门到精通5:PasswordBox的绑定

    原文:WPF MVVM从入门到精通5:PasswordBox的绑定   WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通 ...

  9. Training: MySQL I (MySQL, Exploit, Training)

    题目链接:http://www.wechall.net/challenge/training/mysql/auth_bypass1/index.php?highlight=christmas 的确是非 ...

  10. 一起来做Chrome Extension《一些问题》

    目录 Unchecked runtime.lastError: The message port closed before a response wa received. 使用 eval Conte ...