zoukankan      html  css  js  c++  java
  • F

    度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串。现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值。一个字符串的哈希值,由以下公式计算得到: 

    H(s)=ilen(s)i=1(Si28) (mod 9973)
    SiSi代表 S[i] 字符的 ASCII 码。 

    请帮助度熊计算大字符串中任意一段的哈希值是多少。

    Input多组测试数据,每组测试数据第一行是一个正整数NN,代表询问的次数,第二行一个字符串,代表题目中的大字符串,接下来NN行,每行包含两个正整数aa和bb,代表询问的起始位置以及终止位置。 

    1N1,0001≤N≤1,000 

    1len(string)100,0001≤len(string)≤100,000 

    1a,blen(string)1≤a,b≤len(string) 
    Output对于每一个询问,输出一个整数值,代表大字符串从 aa位到 bb 位的子串的哈希值。Sample Input

    2
    ACMlove2015
    1 11
    8 10
    1
    testMessage
    1 1

    Sample Output

    6891
    9240
    88
    原题:HDU - 5685 
    解题思路:线段树问题,第一次做不知道连乘的符号;
     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 using namespace std;
     5 
     6 const int MAX = 1000000*10;
     7 int N;
     8 char a[MAX];
     9 int A[MAX];
    10 
    11 struct Seg
    12 {
    13     int veg;
    14 }seg[MAX];
    15 
    16 void CJ(int root,int istrct,int iend,int A[])
    17 {
    18     if(istrct == iend)
    19     {
    20         seg[root].veg = A[iend];
    21     }
    22     else
    23     {
    24         int mid = (istrct+iend)/2;
    25         CJ(root*2+1,istrct,mid,A);
    26         CJ(root*2+2,mid+1,iend,A);
    27         seg[root].veg = seg[root*2+1].veg*seg[root*2+2].veg%9973;
    28     }
    29 }
    30 
    31 int Cha(int root,int istrct,int iend ,int nstrct,int nend)
    32 {
    33     if(nstrct >iend||nend < istrct)
    34         return 1;
    35     if(nstrct <= istrct&&nend >=iend)
    36     {
    37         return seg[root].veg;
    38     }
    39 
    40     int mid = (istrct + iend)/2;
    41     return Cha(root*2+1,istrct,mid,nstrct,nend)*Cha(root*2+2,mid+1,iend,nstrct,nend)%9973;
    42 }
    43 
    44 int main()
    45 {
    46     while(cin>>N)
    47     {
    48         scanf("%s",a);
    49         int len = strlen(a);
    50         for(int i =1;i <=len;i++)
    51         {
    52             int temp = a[i-1] - 28;
    53             A[i] = temp;
    54         }
    55         CJ(0,1,len,A);
    56         int x,y;
    57         while(N--)
    58         {
    59             cin>>x>>y;
    60             cout<<Cha(0,1,len,x,y)<<endl;
    61         }
    62 
    63     }
    64 
    65     return 0;
    66 }



  • 相关阅读:
    CCF认证201809-2买菜
    git删除本地保存的账号和密码
    mysql表分区
    使用java代码将时间戳和时间互相转换
    Mysql数据库表被锁定处理
    mysql查询某个数据库表的数量
    编译nginx错误:make[1]: *** [/pcre//Makefile] Error 127
    LINUX下安装pcre出现WARNING: 'aclocal-1.15' is missing on your system错误的解决办法
    linux下安装perl
    [剑指Offer]26-树的子结构
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7375511.html
Copyright © 2011-2022 走看看