• Palindrome Degree(hash的思想题)


    个人心得:这题就是要确定是否为回文串,朴素算法会超时,所以想到用哈希,哈希从左到右和从右到左的key值一样就一定是回文串,

    那么问题来了,正向还能保证一遍遍历,逆向呢,卡住我了,后面发现网上大神的秦九韶算法用上了,厉害了。

    关于哈希,这题用的是最简单的哈希思想,就是用M取合理的素数,这题取得是3,

    然后正向就是 a+=a*M+ch[i]。逆向用秦九韶可以在循环的时候算出来,

    举个例子比如三个值1,2,3。

    假如逆向开始 则 (((0+s[3])*M+s[2])*M+s[1]);化简就等于s[1]+s[2]*M+s[3]*M^2;

    哇,规律就来了,那么在正向就能确定逆向的值,服气服气

    题目:

    String s of length n is called k-palindrome, if it is a palindrome itself, and its prefix and suffix of length  are (k - 1)-palindromes. By definition, any string (even empty) is 0-palindrome.

    Let's call the palindrome degree of string s such a maximum number k, for which s is k-palindrome. For example, "abaaba" has degree equals to 3.

    You are given a string. Your task is to find the sum of the palindrome degrees of all its prefixes.

    Input

    The first line of the input data contains a non-empty string, consisting of Latin letters and digits. The length of the string does not exceed 5·106. The string is case-sensitive.

    Output

    Output the only number — the sum of the polindrome degrees of all the string's prefixes.

    Example

    Input
    a2A
    Output
    1
    Input
    abacaba
    Output
    6
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<set>
     5 #include<vector>
     6 #include<cstring>
     7 #include<iomanip>
     8 #include<algorithm>
     9 using namespace std;
    10 #define inf 1<<29
    11 #define nu 4000005
    12 #define maxnum 5000005
    13 #define num 2005
    14 int n;
    15 const long long N = 13, M = 3;
    16 char ch[maxnum];
    17 long long number[maxnum];
    18 long long sum;
    19 int main()
    20 {
    21     scanf("%s",ch);
    22     int len=strlen(ch);
    23     long long a=0,b=0,p=1;
    24     memset(number,0,sizeof(number));
    25     for(int i=0;i<len;i++){
    26         a=a*M+ch[i];b+=ch[i]*p;p*=M;
    27         if(a==b) sum+=number[i+1]=(number[(i+1)/2]+1);
    28     }
    29     printf("%lld
    ",sum);
    30     return 0;
    31 }


  • 相关阅读:
    解析空白符(空白,制表)分隔的字串
    关于select—页面中的ListBox的Javascript
    【函数】strcat源代码
    【SQL语法】系列08:利用Update更新表中数据
    【函数】fill和fill_n填充之区别
    【Xcode】编辑与调试
    【网站】在WAMP下安装wordpress
    【SQL语法】系列06:利用ORDER BY排序
    【SQL语法】系列07:利用insert into插入新行
    【Boost】系列03:内存管理之shared_ptr智能指针
  • 原文地址:https://www.cnblogs.com/blvt/p/7955078.html
Copyright © 2020-2023  润新知