题目大意:给你一个字符串,和一些问题,每个问题问你[l,r]子串的哈希值是多少。

哈希值计算方法为:$H(s)=\prod _{i=1} ^{i\leq len(s)}(s_i-28)(mod\ 9973)$。

其中$s_i$代表 S[i] 字符的 ASCII 码。

解题思路:我们知道,要算区间[l,r]所有的和,就可以用$O(n)$的时间预处理出数组t,令$t[i]$表示前i个数的和,那么$t[r]-t[l-1]$即为区间[l,r]所有之和,询问时间复杂度$O(1)$,这就是维护前缀和的做法。

那么这道题,我们也可以维护一个前缀,令$t[i]$表示前i个字符的哈希值,然后[l,r]子串的哈希值就为$\frac{t[r]}{t[l-1]}$。

等等,有个取模运算,那这样做不就WA了?没事,我们把$t[r]$除以$t[l-1]$改成$t[r]$乘($t[l-1]$的乘法逆元)即可。计算乘法逆元用扩展欧几里得算法即可。

时间复杂度$O(Tn\log (a+b))$,其中T为数据组数。

注意事项:$t[0]$一定要赋成1,否则你怎么算答案都是0!!!

C++ Code:

#include<cstdio>
#include<cstring>
using namespace std;
#define p 9973
int n;
char s[100004];
int t[100004];
int exGcd(int a,int b,int& x,int& y){
if(b==0){
x=1,y=0;
return a;
}
int gcd=exGcd(b,a%b,x,y);
int q=x;
x=y;
y=q-a/b*y;
return gcd;
}
int calc(int l,int r){
int x,y;
exGcd(t[l-1],p,x,y);
return t[r]*((x%p+p)%p)%p;
}
int main(){
while(scanf("%d",&n)!=EOF){
scanf("%s",s+1);
t[0]=1;
int len=strlen(s+1);
for(int i=1;i<=len;++i)t[i]=t[i-1]*(s[i]-28)%p;
int l,r;
while(n--){
scanf("%d%d",&l,&r);
printf("%d\n",calc(l,r));
}
}
return 0;
}

[HDU5685]2016"百度之星" - 资格赛 Problem A的更多相关文章

  1. HDU 5685:2016"百度之星" - 资格赛 Problem A

    原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others)    ...

  2. HDU 5688:2016"百度之星" - 资格赛 Problem D

    原文链接:https://www.dreamwings.cn/hdu5688/2650.html Problem D Time Limit: 2000/1000 MS (Java/Others)    ...

  3. HDU 5686:2016"百度之星" - 资格赛 Problem B

    原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others)    ...

  4. [HDU5686]2016"百度之星" - 资格赛 Problem B

    题目大意:给你n,规定一个串中相邻的两个1可以合并为一个2(别的不行),让你求长度为n的全1串最多能变成多少种不同的串. 解题思路:我们先来找一波规律,发现n=1,2,3,4,5时答案分别为1,2,3 ...

  5. [HDU5687]2016"百度之星" - 资格赛 Problem C

    题目大意:有n个操作,每个操作是以下三个之一,要你实现这些操作. 1.insert : 往字典中插入一个单词2.delete: 在字典中删除所有前缀等于给定字符串的单词3.search: 查询是否在字 ...

  6. [HDU5688]2016"百度之星" - 资格赛 Problem D

    题目大意:给你n个字符串,如果一个字符串可以通过重新排列变成另一个字符串,则认为这两个字符串相等.每输入一个字符串,输出这个字符串和与它相等的之前出现了几次. 解题思路:我们可以用map保存一个字符串 ...

  7. 2016百度之星资格赛 Problem A(前缀积与求逆元)

    题意:给出一个字符串,每次询问给出x和y要求算出从x到y的每个字符的(ASCII 码值-28)的值的积(mod9973). 分析:首先的想法肯定是算出每个位置的前缀积,然后只要F[y]/F[x-1]即 ...

  8. 2016百度之星资格赛 Problem B(大数+组合数)

    题意:度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列.最多200个1. 比如 ...

  9. 2016百度之星 资格赛ABCDE

    看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...

随机推荐

  1. oralce存储过程实现不同用户之间的表数据复制

    create or replace procedure prc_test123 is temp_columns ); sqltemp ); cursor cur is select table_nam ...

  2. jQuery中的DatePicker今天按钮不起作用

    转载:http://codego.net/63433/ jquery-ui 日期选择器datepicker我想用 jQueryUI 的 DatePicker ,并显示“今天”按钮, 但它不工作,它也不 ...

  3. mac上用VMWare虚拟机装Linux-Ubuntu

    1.下载vmware fusion for Mac 网上有很多,大家自己找吧 2.安装Vmware 3.序列号可以在网上找,或者淘宝几块钱买一个(记得买对应版本的) 4.之后就下一步,完成就好 安装U ...

  4. 使用tf.ConfigProto()配置Session运行参数和GPU设备指定

    参考链接:https://blog.csdn.net/dcrmg/article/details/79091941 tf.ConfigProto()函数用在创建session的时候,用来对sessio ...

  5. BlankUtil(判断是否为空和去除多余空格)

    package com.drn.core.util; import java.io.Serializable; import java.util.Map; import java.util.Prope ...

  6. MVC总结

    一.转自https://zhuanlan.zhihu.com/p/35680070 MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来, ...

  7. nginx配置修改

    改变nginx配置想让它生效而不停止服务,如下两种方式都可以:1) 检查nginx配置: nginx -t; 配置重载: nginx -s reload2) 检查nginx配置: nginx -t; ...

  8. 讲一讲java异常及自定义异常

    1.异常,说白了.两种,一种就是就是不能让代码通过编译的异常.另一种就是程序运行期间出现的异常.异常就是错误,只要出现异常,程序就不会向下运行了.就不会执行后面的代码了.这时候就可以通过显示statc ...

  9. [AngularJS]Chapter 3 使用AngularJS构建应用程序

    本章内容提要: 如何布置AngularJS进行快速开发 开启服务器进行测试 使用Karma进行单元测试用例测试 编译压缩AngularJS进行生产 使用Batarang进行Debug 如何简化开发工作 ...

  10. ORA-38760: This database instance failed to turn on flashback database

    ORA-38760: This database instance failed to turn on flashback database 问题背景:        測试数据库运行shutdown ...