M - Palindromic String

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 128000/128000KB (Java/Others)
Submit Status

秋实大哥喜欢探索新鲜事物,最近他发明了一种新型回文串,叫K重回文串!今天他想用它来考考小朋友们。

秋实大哥给出了与K重回文串有关的信息

任何字符串都属于0重回文串,包括空字符串。
一个长度为N的字符串S,S是K(k≥1)重回文串,当且仅当S是回文串,且其长度为⌊N2⌋的前缀和长度为⌊N2⌋的后缀是K−1重回文串。
如果一个字符串是K重回文串,则称该字符串有一个回文值为K。一个字符串可以有多个回文值,比如S=abaaba,其回文值可为0,1,2,3。
字符串的最大回文值是该字符串所有回文值的最大值。
若字符串S的最大回文值≥1,则S一定是回文串。
一个字符串S,如果其正着读和反着读是一样的,则称S是回文串,比如aabaa,aba,a。但abc,abab,aacba就不是回文串。
一个长度为N的字符串S,其有N+1个前缀和N+1个后缀(不一定非空),比如abcde,有6个前缀,分别是空字符串,a,ab,abc,abcd,abcde;有6个后缀,分别是空字符串,e,de,cde,bcde,abcde。

秋实大哥给你一个字符串S,他想问问你,S所有前缀的最大回文值之和是多少?

Input

第一行输入一个字符串S(0<|S|≤2⋅106),S包含 大写英文字母(A-Z),小写英文字母(a-z),数字(0-9)

Output

输出一个整数,表示S所有前缀的最大回文值之和。

Sample input and output

Sample Input Sample Output
z
1
a2Az
1
abacaba
6
CCeCeCCCee
4
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
231

Hint

下面对样例3进行解释:
abacaba有8个前缀,分别是 空字符串,a,ab,aba,abac,abaca,abacab,abacaba;
设P(i) 表示第 i 个前缀的最大回文值,且空字符串是第0个前缀;
则P(0)=0,P(1)=1,P(2)=0,P(3)=2,P(4)=0,P(5)=0,P(6)=0,P(7)=3;那么∑7i=0P(i)=6。

解题报告:

这是一道阅读题,读懂了就很简单,我们的目的就是快速判断某一前缀是否是回文串,使用hash进行判断即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 2e6 + , p1 = , p2 = , mod1 = 1e9 + ,mod2 = 1e9 + ;
char s[maxn];
int len,ans[maxn];
ll hash1[maxn],hash3[maxn],px[maxn]; void init_hash()
{
hash1[] = ,hash3[] = ;
for(int i = ; i <= len ; ++ i)
hash1[i] = (hash1[i-]*p1 + s[i]) % mod1;
for(int i = len ; i >= ; -- i)
hash3[len-i+] = (hash3[len-i]*p1 + s[i]) % mod1;
} int gethashvalue(int l,int r,int id)
{
ll ans;
if (id == )
{
ans = (hash1[r] - hash1[l-]*px[r-l+])%mod1;
if (ans < )
ans += mod1;
return ans;
}
else if(id == )
{
ans = (hash3[r] - hash3[l-]*px[r-l+])%mod1;
if (ans < )
ans += mod1;
return ans;
}
} int main(int argc,char *argv[])
{
scanf("%s",s+);len = strlen(s+);init_hash();ans[] = ;
px[] = ;
for(int i = ; i <= len ; ++ i)
px[i] = (px[i-]*p1)%mod1;
for(int i = ; i <= len ; ++ i)
{
if ( gethashvalue(,i,) == gethashvalue(len-i+,len,))
ans[i] = ans[i/]+;
else
ans[i] = ;
}
long long out = ;
for(int i = ; i <= len ; ++ i)
out += ans[i];
printf("%lld\n",out);
return ;
}

UESTC_Palindromic String 2015 UESTC Training for Search Algorithm & String<Problem M>的更多相关文章

  1. UESTC_Ferris Wheel String 2015 UESTC Training for Search Algorithm & String<Problem L>

    L - Ferris Wheel String Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 43000/43000KB (Java/ ...

  2. UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm & String<Problem N>

    N - 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limit: 1300/1300KB (Java/Others) Submit Stat ...

  3. UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>

    K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Su ...

  4. UESTC_Eight Puzzle 2015 UESTC Training for Search Algorithm & String<Problem F>

    F - Eight Puzzle Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) ...

  5. UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>

    E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. UESTC_基爷的中位数 2015 UESTC Training for Search Algorithm & String<Problem D>

    D - 基爷的中位数 Time Limit: 5000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  7. UESTC_基爷与加法等式 2015 UESTC Training for Search Algorithm & String<Problem C>

    C - 基爷与加法等式 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  8. UESTC_邱老师降临小行星 2015 UESTC Training for Search Algorithm & String<Problem B>

    B - 邱老师降临小行星 Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65536/65535KB (Java/Others) Su ...

  9. 2015 UESTC Training for Search Algorithm & String - M - Palindromic String【Manacher回文串】

    O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度 ...

随机推荐

  1. PhpForm表单验证

    <!DOCTYPE HTML> <html> <meta http-equiv="Content-Type" content="text/h ...

  2. 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  3. eq,neq,gt,lt等表达式缩写

    eq 等于neq 不等于gt 大于egt 大于等于lt 小于elt 小于等于like LIKEbetween BETWEENnotnull IS NUT NULLnull IS NULL

  4. cStringIO模块例子

    # Vorbis comment support for Mutagen # Copyright 2005-2006 Joe Wreschnig # # This program is free so ...

  5. jquery.validate详解二

    五.常用方法及注意问题 1.用其他方式替代默认的SUBMIT $().ready(function() {  $("#signupForm").validate({         ...

  6. hdu 2846

    字典树的变形,常规字典树用来求前缀的,所以把每个单词拆成len个词建树,为了避免abab这样的查ab时会出现两次,每次加一个标记,如果该节点上次的建树的单词与本次相同就不更新,否则更新 #includ ...

  7. 关于c语言的一个小bug(c专家编程)

    不多说,说了都是累赘!直接看代码吧! #include <stdio.h> int array[] = {23, 34, 12, 17, 204, 99, 16}; #define TOT ...

  8. (转载)js获取JqueryString方法小结

    一.<script>urlinfo=window.location.href; //获取当前页面的urllen=urlinfo.length;//获取url的长度offset=urlinf ...

  9. Tcp 数据对象传输接口对象设计

    输入是一个对象inputObj,接口对象.Send(inputObj),对端接收之后解包成outputObj(与inputObj应相同),触发onPackageReceive事件 事件 public ...

  10. baidu地图的一个拾取坐标系统

    http://api.map.baidu.com/lbsapi/getpoint/index.html 可以很方便的通过标记取得经纬度坐标 也可以输入经纬度坐标获得地图标记