ACM学习历程—2016"百度之星" - 资格赛(Astar Round1)
http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690
A题:
给定字符串,求任意区间的Hash值。
根据题目给定的Hash方式,属于乘法类型,那么就可以预处理出所有的乘法前缀,然后利用逆元,就可以得到任意区间的Hash值。
不过在这题上跪了好久,最后讨论版的一位大神给出了一个很叼的隐含条件:“同志们,当a, b超范围的时候,输出上一次询问的答案,亲测可行。。。太坑了。。。”
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <vector>
#define MOD 9973 using namespace std; const int maxN = ;
int q, len, ans, inv[], s[maxN];
char str[maxN]; void init()
{
//***预处理所有i在质数MOD下的逆元
inv[] = ;
for (int i = ; i < ; i++)
inv[i] = inv[MOD%i]*(MOD-MOD/i) % MOD;
} void input()
{
scanf("%s", str);
len = strlen(str);
for (int i = ; i < len; ++i)
{
if (i == ) s[i] = (str[i]-+MOD)%MOD;
else s[i] = s[i-]*(str[i]-+MOD)%MOD;
}
} bool judge(int lt, int rt)
{
if (lt > rt) return false;
if (lt < || lt > len) return false;
if (rt < || rt > len) return false;
return true;
} inline int getHash(int from, int to)
{
return (from == ? s[to] : s[to]*inv[s[from-]]%MOD);
} void work()
{
int lt, rt;
for (int i = ; i < q; ++i)
{
scanf("%d%d", <, &rt);
if (judge(lt, rt))
ans = getHash(lt-, rt-);
printf("%d\n", ans);
}
} int main()
{
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
init();
while (scanf("%d", &q) != EOF)
{
input();
work();
}
return ;
}
B题:
一个递推,如果有n个1,那么要么前两个1结合,要么不结合,那么p(n) = p(n-1)+p(n-2)。然后Java大数直接打表。
代码:
import java.math.BigInteger;
import java.util.Scanner; public class Main
{
BigInteger p[] = new BigInteger[205]; void init()
{
p[1] = new BigInteger("1");
p[2] = new BigInteger("2");
for (int i = 3; i < 205; ++i)
p[i] = p[i-1].add(p[i-2]);
} public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
Main ans = new Main();
int n = 0;
ans.init();
while (input.hasNext())
{
n = input.nextInt();
System.out.println(ans.p[n]);
}
}
}
C题:
一道字符串前缀问题。
有三种操作,插入一个单词,删除给定前缀的所有单词,查询是否存在给定前缀的单词。
用字典树搞,插入的时候,给路径上所有结点的vis加1。
删除的时候,删除前缀后面的所有子树,并将路径上所有结点的vis值,减去最末结点的vis值。
查询时,一旦路径上有一个vis值为0,就查询失败。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <vector> using namespace std; struct Trie
{
int vis;
int next[];
}tree[]; int q, top; void build()
{
top = ;
for (int i = ; i < ; ++i) tree[].next[i] = -;
tree[].vis = ;
} int createNode()
{
top++;
for (int i = ; i < ; ++i) tree[top].next[i] = -;
tree[top].vis = ;
return top;
} void add(char str[])
{
int len = strlen(str), k, now = ;
for (int i = ; i < len; ++i)
{
k = str[i]-'a';
if (tree[now].next[k] == -) tree[now].next[k] = createNode();
now = tree[now].next[k];
tree[now].vis++;
}
} void del(char str[])
{
int len = strlen(str), k, now = , cnt;
for (int i = ; i < len; ++i)
{
k = str[i]-'a';
if (tree[now].next[k] == -) return;
now = tree[now].next[k];
}
for (int i = ; i < ; ++i) tree[now].next[i] = -;
cnt = tree[now].vis;
now = ;
for (int i = ; i < len; ++i)
{
k = str[i]-'a';
now = tree[now].next[k];
tree[now].vis -= cnt;
}
} bool get(char str[])
{
int len = strlen(str), k, now = ;
for (int i = ; i < len; ++i)
{
k = str[i]-'a';
if (tree[now].next[k] == -) return false;
now = tree[now].next[k];
if (!tree[now].vis) return false;
}
return true;
} void work()
{
build();
char op[], str[];
for (int i = ; i < q; ++i)
{
scanf("%s%s", op, str);
switch (op[])
{
case 'i':
add(str);
break;
case 'd':
del(str);
break;
case 's':
if (get(str)) printf("Yes\n");
else printf("No\n");
break;
}
}
} int main()
{
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
while (scanf("%d", &q) != EOF)
work();
return ;
}
D题:
这题直接排序+map能过。没试字典树。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <vector> using namespace std; int main()
{
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int n;
char str[];
while (scanf("%d", &n) != EOF)
{
map<string, int> s;
for (int i = ; i < n; ++i)
{
scanf("%s", str);
sort(str, str+strlen(str));
printf("%d\n", s[str]++);
}
}
return ;
}
ACM学习历程—2016"百度之星" - 资格赛(Astar Round1)的更多相关文章
- 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)D
Problem Description 度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的 ...
- 2016百度之星资格赛 Round1(2,3,4题)
Problem B Accepts: 2515 Submissions: 9216 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- 2016"百度之星" - 资格赛(Astar Round1)
逆元 1001 Problem A 求前缀哈希和逆元 #include <bits/stdc++.h> typedef long long ll; const int MOD = 9973 ...
- 2016"百度之星"-资格赛
//本题要求:(Ar*A2...An)%p,亦即[(A1*A2*...An)/(A1*A2*...Ar-1)]%p,由于A1*A2...An乘积过大,无法求得相除所得的结果 //我们需要用到乘法逆元( ...
- 2016"百度之星" - 资格赛(Astar Round1) 1004
思路:题目很简单,直接用map记录每个字符串的个数就可以了.记得对每个字符串先sort(). AC代码: #include <cstdio> #include <stdlib.h&g ...
随机推荐
- 每天一个Linux命令(50)netstat命令
netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况. (1)用法: 用法: netstat [选项参数] (2)功能: ...
- Linux centos7 安装 keepalived-2.0.6
1.下载(版本:2.0.6) cd /home/install/ wget http://124.205.69.170/files/1255000006EF2AA1/www.keepalived.or ...
- python中初始化实例属性
虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性.例如,Person类应该在创建的时候就拥有 name.gender 和 birth 属性,怎么办? 在 ...
- git 使用教程 --基础二
一:分支学习: branch称为分支,默认仅有一个名为master的分支.一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支. 分支的作用: 创建分支:(创建分 ...
- CMD mysql 备份脚本
创建.bat文件 echo. echo MySQL数据库备份脚本 echo ***************************** echo. echo 备份日期:%date% echo 备份时间 ...
- Kubernetes StatefulSets
StatefulSets对于需要以下一项或多项的应用程序非常有用. 稳定,唯一的网络标识符. 稳定,持久的存储. 有序,优雅的部署和缩放. 有序,优雅的删除和终止. 有序的自动滚动更新. POD Id ...
- maven junit.framework不存在问题解决
问题 在使用maven进行一个工程的编译,已加入junit包的依赖,编译的时候却总是报“junit.framework不存在”错误. pom.xml中junit包加入如下: <dependenc ...
- jquery01-简介+语法+选择器+事件
jQuery是一个JavaScript函数库,是一个轻量级的"写的少,做的多"的JavaScript库,包含以下功能: HTML 元素选取 HTML 元素操作 CSS 操作 HTM ...
- RtlWerpReportException failed with status code :-1073741823
在release下程序运行总是崩溃:debugView输出了这个崩溃信息, 1. 一开始是release看崩溃,各种二分法找崩溃点,太玄没找到: 2. 终于想到可以调试,我草,调试一下瞬间发现某个cl ...
- ADO.NET入门教程(一) 初识ADO.NET
摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分 ...