码迷,mamicode.com
首页 > 其他好文 > 详细

uestc Palindromic String

时间:2015-05-08 20:15:32      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

字符串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\n",ans);
64     return 0;
65 }
66 /*
67 CCeCeCCCee
68 */

 

uestc Palindromic String

标签:

原文地址:http://www.cnblogs.com/baby-mouse/p/4488676.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!