Problem A : 字符串的Hash值
Problem Description
度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串。现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值。一个字符串的哈希值,由以下公式计算得到:
度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串。现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值。一个字符串的哈希值,由以下公式计算得到:
度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串。现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值。一个字符串的哈希值,由以下公式计算得到:
Si 代表 S[i] 字符的 ASCII 码。
请帮助度熊计算大字符串中任意一段的哈希值是多少。
Output
对于每一个询问,输出一个整数值,代表大字符串从 aa 位到 bb 位的子串的哈希值。
Sample Input
Copy
2
ACMlove2015
1 11
8 10
1
testMessage
1 1
Sample Output
6891
9240
88
分析:
本题最直接的思路是直接计算每次的hash值,但是需要对每组String内输入的a和b都需要从a 位置计算到b 位置,系统会显示TLE, 所以,这里需要用到乘法逆元(具体请自行百度)。
java代码如下:
package bestcoder;
import java.util.Scanner;
//
public class HashOfString {
public int maxLen = 1000001;
public int inv[] = new int [maxLen];
public int re[] = new int [maxLen];
public int allHash[];
public int mod = 9973;
public static void main(String args[]) {
HashOfString m = new HashOfString();
m.getInput();
}
public void getInput() {
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
int T = cin.nextInt();
String str = cin.next();
getArray(str);
for (int i = 1; i <= T; i++) {
int a = cin.nextInt();
int b = cin.nextInt();
int num = getNum(a , b);
System.out.println(num);
}
}
cin.close();
}
public void getArray(String str){
inv[1]=1;
for(int i=2;i<maxLen;++i)
{
inv[i]=inv[mod%i]*(mod-mod/i)%mod;
}
allHash = new int[str.length() + 1];
allHash[0] = 1;
re[0] = 1