Palindrome Degree题解

Palindrome Degree题解

其实是道水题,
但是我太弱了!!!
开始想着如何判断后缀是回文,
屈辱看题解后发现,
只要判断前缀,然后判断后缀的反向是否与前缀相等即可,
但是我居然将kmp与回文弄混了,直接判前后缀相不相等,
太弱了!!败犬的哀嚎

#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=5e6+7;
int n,t,f[N],ans=0;
ull base=137,mi[N],sum[N],sum2[N];
char s[N];
ull check(int x,int y){return sum2[x+y]-sum2[x]*mi[y];}
int main(){
    scanf("%s",s+1),n=strlen(s+1),mi[0]=1,mi[1]=base;
    for(int i=1;i<=n;++i) sum[i]=sum[i-1]*base+(ull)s[i],mi[i]=mi[i-1]*base,sum2[i]=sum2[i-1]*base+(ull)s[n-i+1];
    for(int i=1;i<=n;++i){
        t=(i>>1);
        if(sum[t]==check(n-i,t)) f[i]=f[t]+1;
        ans+=f[i];
    }
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/ljk123-de-bo-ke/p/11674531.html

时间: 2024-07-30 22:09:43

Palindrome Degree题解的相关文章

POJ 3280 Cheapest Palindrome DP题解

看到Palindrome的题目,首先想到的应该是中心问题,然后从中心出发,思考如何解决. DP问题一般是从更加小的问题转化到更加大的问题,然后是从地往上 bottom up地计算答案的. 能得出状态转移方程就好办了,本题的状态转移方程是: if (cowID[i] == cow{j]) tbl[id][i] = tbl[id][i+1];//相等的时候无需改动 else tbl[id][i] = min(tbl[!id][i+1] + cost[cowID[i]-'a'], tbl[!id][i

POJ 3280 Cheapest Palindrome 动态规划法题解

Description Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate it. He has installed on each cow an electronic ID tag that the system will read as the cows pass by a scanner. Each ID tag's contents are

Codeforces Beta Round #7--D. Palindrome Degree(Manacer)

题目:http://blog.csdn.net/winddreams/article/details/44218961 求出每一个点为中心的最长字符串,推断该串是不是从开头的回文串. #include <cstdio> #include <cstring> #include <algorithm> using namespace std ; int p[12000000] , dp[6000000]; char s[12000000] , str[12000000] ;

Palindrome Degree(CodeForces 7D)—— hash求回文

学了kmp之后又学了hash来搞字符串.这东西很巧妙,且听娓娓道来. 这题的题意是:一个字符串如果是回文的,那么k值加1,如果前一半的串也是回文,k值再加1,以此类推,算出其k值.打个比方abaaba,k值为3,abaxxaba,k值为1.现在,给出一个串,让你求这个串的所有前缀(包括本身)的k值的和. 如果考虑马拉车,那么先预处理出每个地方的最长回文长度,然后不断的截断,如果子串的回文长度大于其回文长度,那么k值加1,这样即可.但是马拉车写起来比较繁琐,没有模板我也没法手写. 这里提供hash

CodeForces 7D Palindrome Degree

字符串hash.首先说下需要注意的地方:当对Mod取余时,可能造成本不相同的,取余结束之后相同了. 此时应对多个不同的Mod取余,多次计算只能说降低上述情况的发生.感觉正式比赛中不会有这种题,比较拼RP. 比如此题,Mod = 2^32,可以,Mod = 2^64,WA了... #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <

CodeForces 7D Palindrome Degree 字符串hash

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

HDU4632 Palindrome subsequence 题解 区间DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632[题目描述]<回文子串数量>给你一个长度为N(N≤1000)的字符串,你输出它所有的回文子串的数量(对10007取模).只要从字符串 s 中顺序地取出一些字符(不要求连续,可以是 s 本身,不能是空串),不改变他们的顺序的情况下,这个子串是一个回文串,那么他就是一个 s 的回文子串.[输入格式]首先是一个数T(T≤50),表示测试用例的数量.接下来T行,每行包含一个字符串.[输出格式]对于每一

CF1324B Yet Another Palindrome Problem 题解

原题链接 CF 127个测试点,好评 简要题意: 多组数据,问数组中是否有长度 \(\geq 3\) 的回文子序列. 我们需要找到本质. 题目不让我们求这个长度,只让我们判断,这是为什么呢? 如果答案是 YES,那么必然存在一个长度为 \(3\) 的回文子序列.否则为 NO. 你想,如果原数组的最长回文序列是奇数的话,只要每次在两边同时删去一个,就可以得到长度为 \(3\) 的回文子序列. 如果是偶数,只要每次在两边同时删去一个,再在最中间两个任意删去一个,也可以得到长度为 \(3\) 的回文子

[Accumulation Degree]题解

换根dp板子题,首先,我们要想想如果根为1时,1的答案 我们设\(dp[i]\)表示以\(i\)为根子树的中,若\(i\)有无限流量,i点能往下流的最大流量. 我们不难推出式子\(dp[i]=\sum_{v\in son(i)}min(dp[v],w(u->v))\) 意义就是,我们知道一个儿子v可以向下流的最大流量是\(dp[v]\),我们最多可以向儿子v流\(w(u->v)\)的流量,所以我们最多向该儿子流\(min(dp[v],w(u->v))\)的流量,所有儿子的这个值的和就是\