首页 > TAG信息列表 > HNOI2004
P2292 [HNOI2004] L 语言
给出字典(个数为 \(n\))和文章(个数为 \(m\) ),求文章最大匹配前缀。\(n\leq 20,m\leq 50\) , \(|s|\leq 20, |t|\leq 2\times 10^6\) 首先想到用AC自动机,在每个字串结尾标记串的长度,即 \(bj[p]=slen\) 。构造一个 \(ans\) 数组, \(ans[i]=1\) 表示 \(ans[i]\) 之前都可以被理解。初值P2293 [HNOI2004]高精度开根 题解
link P2293 [HNOI2004]高精度开根 求 \(a\) 的 \(b\) 次根 sol 由于 \(f(x)=x^n=k\) 是单调的,所以二分找到答案就好了 code a=int(input()) b=int(input()) l=0 r=1 while(r**a<=b): l=r;r=r*2 while(l+1<r): mid=(l+r)//2 if (mid**a<=b): l=mid else洛谷 P2292 [HNOI2004]L语言(AC自动机,dp)
传送门 解题思路 设dp[i]为先i位能否被理解。 然后在AC自动机上匹配,若 num[j]&&dp[i-cnt[j]] 则 dp[i] 等于 1。(j为不断fail的指针) AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include&lHNOI2004 敲砖块
Description 要打掉一个砖块必须打掉他左上及右上的两个砖块,砖块有得分,问打掉 \(m\) 个获得的最大得分。 \(1\leqslant n\leqslant 50\) Solution 最后打掉的一定是每列选一个前缀: 2 2 3 4 8 2 7 2 3 49 发现可以前缀和优化。 Code #include<bits/stdc++.h> using namespace std;【BZOJ1213】[HNOI2004] 高精度开根(二分+高精)
点此看题面 大致题意: 给定一个高精大整数\(n\),求\(\lfloor\sqrt[m]n\rfloor\)。 前言 其实这种题并没有什么写的价值,纯粹是想检测一下自己的码力,仅此而已。 然而,\(WA\)了,还是错在几个不容易察觉的细节,例如输出时忘记特判\(0\)。单个数据还只是错一两个点,可如果是多组数据的话(现在[HNOI2004] L语言 - AC自动机,dp
给定字典和没有标点的文章,求能够被识别的最长前缀。 显然不能贪心,设\(f[i]\)表示前\(i\)个字符构成的前缀能否被识别,然后在AC自动机上暴力转移即可。 具体来说,每走到一个新位置,就沿着fail链把所有能转移的都转移了。 (突然发现我以前的AC自动机模板好像又有点锅?) #include <bits/stdBZOJ 1211: [HNOI2004]树的计数 prufer序列
直接套用 prufer 序列公式即可,但是要特判不合法的情况. code: #include <cstdio> #include <algorithm> #define ll long long #define N 200 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int bu[N]; void update(int x,int vP2286 [HNOI2004]宠物收养场
题目链接 这道题应该很快看出是平衡树吧。对于每次操作,相当于是在维护好的平衡树上找前驱和后继。一开始我想的是维护两棵平衡树,一棵宠物树,一棵是人树。但是我这样搞就非常傻逼,而且非常难调。其实只用维护一棵平衡树就够了,用一个变量来记录当前是宠物多还是人多,在树上查询前驱和后Luogu P2292 [HNOI2004]L语言
Portal(传送门) 解析 看到单词和句子匹配,再看数据范围1M的字符串(长度大约 $ 10^6 $ 级别),所以用Trie树来处理 句子是没有标点符号的,所以需要我们自己断句,那么我们先将所有单词加入Trie树,然后让句子在树上匹配,匹配时可不可以匹配完一个单词就将其从句子中删掉呢? 上面这个问题的[BZOJ1208][HNOI2004]宠物收养所
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12554 Solved: 5187[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己[HNOI2004]打鼹鼠
题目链接 题目简述:首先吧,这道题我们用DP。毕竟它有可转移的状态又是求最优解。选择了DP之后考虑维度,一开始我想的是棋盘嘛,再加一个时间,三维一套带走。可是看了数据范围,会爆炸,数组都开不了,实力劝退。那么题目给了我们什么呢? 鼹鼠的位置,出现的时间 但是我们上面的分析发现,这两个[HNOI2004]宠物收养所 题解
一杯茶,一包烟,一道水题调一天 题面 这题一眼看上去就是个裸板子对吧 本来以为要两棵splay,读了一下题发现店里只能有一种生物(人/宠物) 所以记录一下当前店里的状态就行了 老年手速20min过编译, 嗯? 检查了30min发现没取mod 嗯? 检查调试对拍了2h+30min重构代码 发现Splay打错了 int nxt(题解 [HNOI2004]宠物收养场
解析 这题似乎是裸的平衡树\(+\)模拟...于是用\(treap\)写了个板子. 看上去,我们似乎要维护两颗树(宠物和顾客), 然而,注意到,同一时间宠物点只有一类人(或物qwq), 所以,只要判断当前宠物店和询问是否是一样, 根据题意模拟就行了. 另外,没有重复感觉比较舒服 上AC代码吧: #includebzoj 1208: [HNOI2004]宠物收养所 (Treap)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题面: 1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12313 Solved: 5046[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被[HNOI2004]L语言
Description: 给出n个串和m个串, 分别求出这m个串能被n个串中的串拼出的最长前缀 注意:一定是拼出,串不能重叠!!! Hint: \(n,m<=20\) $ len_n<=10 ,len_m<=10^6 $ Solution: 一开始看错题了,还有60多分..... 正解直接dp一下就行了 #include<bits/stdc++.h> using namespace std; const int[HNOI2004]树的计数 BZOJ 1211 prufer序列
题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。 输出格式: 输出满足条件的树有多少棵。 输入输出样例 输入样例#1: 复制 4