zoukankan      html  css  js  c++  java
  • uestc Palindromic String

    字符串hash
    因为如果一个字符串是回文串,那么正着做哈希和反着做哈希结果应该一样。于是我们先正反各做一边哈希。
    如果判断出来一个字符串是回文穿那么这个字符串的前半部分和后半部分的重数一定相同,于是当前位置的字符串回文重数f[i]就等于f[i/2]+1。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cstdlib>
     7 #include<queue>
     8 #include<vector>
     9 #include<map>
    10 #include<stack>
    11 #include<string>
    12 
    13 using namespace std;
    14 
    15 const int MOD=100000009;
    16 const int step=127;
    17 
    18 long long ans;
    19 int len;
    20 char s[2000007];
    21 int p[2000007];
    22 long long hl[2000007];
    23 long long hr[2000007];
    24 long long mr[2000007];
    25 
    26 int main(){
    27     scanf("%s",s+1);
    28     ans=0;
    29     len=strlen(s+1);
    30     memset(p,0,sizeof(p));
    31     memset(hl,0,sizeof(hl));
    32     memset(hr,0,sizeof(hr));
    33     memset(mr,0,sizeof(mr));
    34     for (int i=1;i<=len;i++){
    35             hl[i]=(hl[i-1]*step+s[i])%MOD;
    36     }
    37     for (int i=len;i>=1;i--){
    38             hr[i]=(hr[i+1]*step+s[i])%MOD;
    39     }
    40     mr[0]=1;
    41     for (int i=1;i<=len;i++){
    42             mr[i]=(mr[i-1]*step)%MOD;
    43     }
    44     for (int i=1;i<=len;i++){
    45             if (hl[i]==((hr[1]-hr[i+1]*mr[i])%MOD+MOD)%MOD){
    47                     p[i]=p[i/2]+1;
    48                     ans+=p[i];
    49             }
    50             else{
    51                     p[i]=0;
    52             }
    53     }
    63     printf("%lld
    ",ans);
    64     return 0;
    65 }
    66 /*
    67 CCeCeCCCee
    68 */
  • 相关阅读:
    团队介绍及项目介绍
    2017年秋季个人阅读计划
    软件需求分析阅读笔记
    Cookie学习总结
    暑期兴趣班第二天学习总结
    暑期兴趣班第一天学习总结
    个人总结
    第十六周工作总结
    第十五周工作总结
    第十四周工作总结
  • 原文地址:https://www.cnblogs.com/baby-mouse/p/4488676.html
Copyright © 2011-2022 走看看