2016"百度之星" - 资格赛(Astar Round1) 1001

思路:第一个做法就是:每读入起始位置i和结束位置j,就从这位置i到位置j计算,可是TLE了,后面我想想要是我输入一个最长的字符串,且以最大次数计算开始位置1到结束位置100000,那么这计算量是很大的而且还是重复的。
第二种就是:我先把这个字符串每个位置i到位置j的哈希值都计算出来,然后储存起来,可是字符串最大长度是100000,所以这个n*n的复杂度,当然还是TLE了。
最后还是想到了线段树,而且这题还是裸的线段树,然后写出来了,可是我交了好多次都是RE!很无奈,然后看到该题的讨论版里面提到,如果起始位置超出范围,那么输出上一次的结果就可以了。然后我就加上了这个判断,结果AC了。可是题目给的数据范围是不会超出范围的啊!!是出题人的锅。当然我看到了有些大神过的还是很快的,所以原因还是有自己的一部分,不够严谨。
AC代码:
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 100005;
const int MAX_NN = MAX_N*4;
const int MOD = 9973;
int value[MAX_NN], left[MAX_NN], right[MAX_NN],n,a,b,len;
char word[MAX_N];
void build(int root, int l, int r)
{
left[root] = l;
right[root] = r;
if(l == r) value[root] = word[l]-28;
else
{
int mid = (l+r)/2;
build(root*2, l, mid);
build(root*2+1, mid+1, r); value[root] = (value[root*2] * value[root*2+1] + MOD)%MOD;
} }
int query(int root, int l, int r)
{
if(left[root] == l && right[root] == r) return value[root];
else
{
int mid = (left[root]+right[root])/2; if(r <= mid) return query(root*2, l, r);
else if(l > mid) return query(root*2+1, l, r);
else return (query(root*2, l,mid) * query(root*2+1, mid+1, r) + MOD) %MOD;
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int last = 0;
while(~scanf("%d", &n))
{
scanf("%s", word);
len = strlen(word);
build(1, 0, len-1); if(n == 0) puts("");
while(n--)
{
scanf("%d %d", &a, &b);
if(a > b) swap(a,b);
if( a < 1 || b > len) printf("%d\n", last); //之前老是RE,加上这个就AC了
else printf("%d\n", last = query(1,a-1,b-1));
}
}
return 0;
}
2016"百度之星" - 资格赛(Astar Round1) 1001的更多相关文章
- 2016百度之星 资格赛ABCDE
看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...
- HDU 5688:2016"百度之星" - 资格赛 Problem D
原文链接:https://www.dreamwings.cn/hdu5688/2650.html Problem D Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5686:2016"百度之星" - 资格赛 Problem B
原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5685:2016"百度之星" - 资格赛 Problem A
原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others) ...
- 2016"百度之星" - 资格赛(Astar Round1)
逆元 1001 Problem A 求前缀哈希和逆元 #include <bits/stdc++.h> typedef long long ll; const int MOD = 9973 ...
- 2016"百度之星" - 资格赛(Astar Round1) A
链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=690&pid=1001 我用线段树过的~可能要注意a, ...
- 2016"百度之星" - 资格赛(Astar Round1) 1004
思路:题目很简单,直接用map记录每个字符串的个数就可以了.记得对每个字符串先sort(). AC代码: #include <cstdio> #include <stdlib.h&g ...
- 2016"百度之星" - 资格赛(Astar Round1) Problem E
简单模拟题,耐心写就能过. #include <stdio.h> #include <math.h> #include<cstring> #include<c ...
- 2016"百度之星" - 资格赛(Astar Round1) Problem C
字典树. 插入的时候update一下节点出现的次数. delete的时候,先把前缀之后的全删了.然后看前缀最后一个节点出现了几次,然后前缀上每个节点的次数都减去这个次数. 前缀从上到下再检查一遍,如果 ...
随机推荐
- WPF 控件之ComboBox绑定[2]
最近感觉新的方法Binding comboBox用起来很好用. 记录一下: <ComboBox Grid.Row=" x:Name="cboFamilyName" ...
- 【转】FLV视频封装格式详解
Overview Flash Video(简称FLV),是一种流行的网络格式.目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由The FLV ...
- poj 3273 Monthly Expense(二分搜索之最大化最小值)
Description Farmer John ≤ moneyi ≤ ,) that he will need to spend each day over the next N ( ≤ N ≤ ,) ...
- Python字典的操作与使用
字典的描述 字典是一种key-value的数据类型,使用就像我们上学用的字典,通过拼音(key)来查对应字的详细内容(value). 字典的特性 1.字典是无序的(不像列表一样有下标,它通过key来获 ...
- iOS学习之 plist文件的读写
在做iOS开发时,经经常使用到到plist文件, 那plist文件是什么呢? 它全名是:Property List,属性列表文件,它是一种用来存储串行化后的对象的文件.属性列表文件的扩展名为.pli ...
- Windows下文件列举,搜索
Windows下列举文件用的函数是 FindFirstFile 和 FindNextFile ,另外一个结构体是WIN32_FIND_DATA 以下是MSDN对于WIN32_FIND_DATA的定义 ...
- compareTo简介
compareTo()方法是用来比较字符串大小,该方法用来判断一个字符串是大于,等于还是小于另一个字符串.判断字符串大小的依据是根据他们在字典中的顺序决定的 语法 Str1.compareTo(Str ...
- [计算机组成原理][实验十.R-I-J型指令CPU设计实验总结]
总算解决一大心头之患了,比想象中容易,通宵两夜,刷完了十个实验,这个实验就是最后的了.感慨颇多.特地写篇总结. 想做一件事,就立马去做把.你会发现没那么困难,往往最大的困难,是心里的困难. 培养了HD ...
- asp net 编程问题 实现下一篇 和上一篇效果
首先是access数据库,有一个名为news的表,里面有三个字段,分别为id,classid 和name 其中id为主键,classid可以重复 现在有以下数据: id classid name 1 ...
- Git远程使用技巧
git作为强大的版本管理软件,已经得到了广泛的应用,很多人对于本地的git操作已经非常熟悉了.然而有的时候,我们也需要一个远程的,类似云的仓库来存储我们的一些代码.github给予了我们不限量的空间来 ...