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 */
  • 相关阅读:
    20.GC日志详解及日志分析工具
    19.JVM调优工具锦囊
    两个页面的传参(转自博客园的春哥也编程)
    纯js实现背景图片切换
    关于引用类型用ref传参的问题
    C++ return
    C++内存管理
    Chrome插件开发一(配置文件)
    C++对象传递
    const 与 #define 的比较
  • 原文地址:https://www.cnblogs.com/baby-mouse/p/4488676.html
Copyright © 2011-2022 走看看