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\n",ans);

64     return 0;

65 }

66 /*

67 CCeCeCCCee

68 */

 

你可能感兴趣的:(String)