UESTC_Palindromic String 2015 UESTC Training for Search Algorithm & String<Problem M>

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 + 50 , p1 = 1403641 , p2 = 2807303 , mod1 = 1e9 + 7,mod2 = 1e9 + 9;
char s[maxn];
int  len,ans[maxn];
ll hash1[maxn],hash3[maxn],px[maxn];

void init_hash()
{
   hash1[0] = 0 ,hash3[0] = 0;
   for(int i = 1 ; i <= len ; ++ i)
     hash1[i] = (hash1[i-1]*p1 + s[i]) % mod1;
   for(int i = len ; i >=1 ; -- i)
     hash3[len-i+1] = (hash3[len-i]*p1 + s[i]) % mod1;
}

int gethashvalue(int l,int r,int id)
{
   ll ans;
   if (id == 1)
    {
        ans = (hash1[r] - hash1[l-1]*px[r-l+1])%mod1;
        if (ans < 0)
         ans += mod1;
        return ans;
    }
   else if(id == 3)
    {
        ans = (hash3[r] - hash3[l-1]*px[r-l+1])%mod1;
        if (ans < 0)
         ans += mod1;
        return ans;
    }
}

int main(int argc,char *argv[])
{
  scanf("%s",s+1);len = strlen(s+1);init_hash();ans[1] = 1;
  px[0] = 1;
  for(int i = 1 ; i <= len ; ++ i)
    px[i] = (px[i-1]*p1)%mod1;
  for(int i = 2 ; i <= len ; ++ i)
   {
         if ( gethashvalue(1,i,1) == gethashvalue(len-i+1,len,3))
              ans[i] = ans[i/2]+1;
         else
          ans[i] = 0;
   }
  long long out = 0;
  for(int i = 1 ; i <= len ; ++ i)
   out += ans[i];
  printf("%lld\n",out);
  return 0;
}
时间: 2024-10-12 21:51:35

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

UESTC_Ferris Wheel String 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem L&gt;

L - Ferris Wheel String Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 43000/43000KB (Java/Others) Submit Status Have you ever been to London? Our Master Qiu will tell you how amazing in London and how funny a Ferris Wheel String is. One day

UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem N&gt;

N - 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limit: 1300/1300KB (Java/Others) Submit Status 一天,韩爷去百度面试,面试官给了他这么一个问题. 给你2万个字符串,每个字符串长度都是100,然后把2万个字符串丢入一个 set< string >g 中,问最终set里含有多少个元素? g 是一个用来存储字符串.具有去重功能的容器,即相同字符串在 g 中只能保留一个. 两个字符串相等,当且

UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem K&gt;

K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Submit Status 传说有这么一个故事! 在一个月白风清的晚上,秋实大哥约一位他心仪的妹子一起逛校园,浪漫的秋实大哥决定在当晚对妹子表白.“XXXXX...”,秋实大哥温情地说完了准备已久的话.而妹子决定用一种浪漫的方式接受秋实大哥(其实妹子早已对秋实大哥动心,这一刻她早已迫不及待了,但还是决定

UESTC_Eight Puzzle 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem F&gt;

F - Eight Puzzle Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15 sli

UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem E&gt;

E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 吴队长征婚这件事因为请客而没有传出去(虽然他忘了请一个队吃饭),于是吴队长高兴地玩起了木棒.吴队长拿了一些长度相同的木(guang)棒(gun),随机的把它们截成了N段,每一段最长50.现在他想把这些木棒还原成原来的状态,但是他忘记了原来的木棒有多少根,也忘记了每一根有多长.请帮助

UESTC_基爷的中位数 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem D&gt;

D - 基爷的中位数 Time Limit: 5000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 给你N个数,X1,X2,...,XN, 基爷让我们计算任意两个数差的绝对值 ∣Xi−Xj∣ (1≤i<j≤N) . 这样,我们可以得到 C2N 个数. 现在,基爷希望聪明的你能用一个简单的程序求出这 C2N 个数的中位数! Input 输入有多组数据. 每组数据,第一行一个整数 N

UESTC_基爷与加法等式 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem C&gt;

C - 基爷与加法等式 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 一天,上小学的妹妹跑过来问基爷一道字母加法等式,基爷不假思索的便给出了一组可行解. 聪明的你发现,一个字母等式可能有多种不同解,于是你想编个程序计算一下 Input 输入包含多组数据. 每组数据第一行一个整数n,表示有n个字符串 3 ≤ n ≤ 10 接下来n行,每行有1个最多只

UESTC_邱老师降临小行星 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem B&gt;

B - 邱老师降临小行星 Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65536/65535KB (Java/Others) Submit Status 人赢邱老师和任何男生比,都是不虚的.有一天,邱老师带妹子(们)来到了一个N行M列平面的小行星.对于每一个着陆地点,邱老师总喜欢带着妹子这样走:假设着陆地点为(r0, c0),那么他们下一步只能选择相邻格点,向四周走,即(r0–1, c0), (r0 + 1, c0), (r0

UESTC_全都是秋实大哥 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem J&gt;

J - 全都是秋实大哥 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Submit Status 秋实大哥是一个多愁善感的人,偶尔也会唱唱两句伤情的歌.每次唱完后,秋实大哥都能解决一道问题!这次也不例外. 秋实大哥告诉了你 一些关于这个问题的信息 如果一个字符串S是由若干个子串a连续拼接而成的,则称a是S的循环节,即A=a+a+...+a.比如 aba 是 abaabaaba