BZOJ 4212: 神牛的养成计划
4212: 神牛的养成计划
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 142 Solved: 30
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
emikuqihgokuhsywlmqemihhpgijkxdukjfmlqlwrpzgwrwozkmlixyxniutssasrriafu
emikuqihgokuookbqaaoyiorpfdetaeduogebnolonaoehthfaypbeiutssasrriafu
emikuqihgokuorocifwwymkcyqevdtglszfzgycbgnpomvlzppwrigowekufjwiiaxniutssasrriafu
emikuqihgokuorociysgfkzpgnotajcfjctjqgjeeiheqrepbpakmlixyxniutssasrriafu
emikuqihgokuorociysgfrhulymdxsqirjrfbngwszuyibuixyxniutssasrriafu
emikuqihgokuorguowwiozcgjetmyokqdrqxzigohiutssasrriafu
emikuqihgokuorociysgsczejjmlbwhandxqwknutzgdmxtiutssasrriafu
emikuqihgokuorociysgvzfcdxdiwdztolopdnboxfvqzfzxtpecxcbrklvtyxniutssasrriafu
emikuqihgokuorocsbtlyuosppxuzkjafbhsayenxsdmkmlixyxniutssasrriafu
emikuqihgokuorociysgfjvaikktsixmhaasbvnsvmkntgmoygfxypktjxjdkliixyxniutssasrriafu
10
emikuqihgokuorociysg yxniutssasrriafu
aiegqmedckgqknky eqpoowonnewbq
xfbdnjbazhdnhkhvb qrqgbnmlltlkkbtyn
bjfhrnfedlhrlolzfv qppxpoofxcr
zhdfpldcbjf stsidponnvnmmdvap
zhdfpldcbjfpjmjxdt gdstsidponnvnmmdvap
dlhjtphgfnjtnqnbhxr wxwmhtsrrzrqqhzet
bjfhrnfedlhrlolzfv frqppxpoofxcr
zhdfpldcbjf dponnvnmmdvap
ucyakgyxweakehes nondykjiiqihhyqvk
Sample Output
7
3
5
5
1
3
5
10
4
HINT
Source
万古神牛黄学长 Orz
又是一道可持久化Trie好题。
先想暴力,每次先找出有所能匹配上前缀的串,然后在看看这些串里有多少个还能匹配上后缀,这些串的个数就是最终答案。
然后发现,每次靠前缀筛出来的所有串一定具有一段相同的前缀,这个有点像后缀数组的那种感觉,就是先对所有串按照前缀排序,不难看出每次找出的前缀合法的串一定排成一个区间,我们想访问这个区间的所有串的逆序Trie,这个就是可持久化Trie树了。
从DaD3zZ那里看到这道题的,他说感觉对串按照前缀排序时使用了C++的Sort函数,逐位比较两个串的大小貌似比较暴力;但是不难想到,我们先建出正序的Trie后,在Trie上按顺序(a->z)DFS出来的就是按前缀排好序的了,这样复杂度就是完美的$O(\sum{Length})$,轻松过掉2000000。貌似出题人比较友好(可能就是比较懒),出的数据有点水……
代码没有,懒得写了…… 懒癌晚期
UPDATE 写了一发代码,然后图省事用的string,然后cin就给RE了,下午发现问题改成scanf就可以了。
#include <bits/stdc++.h> using namespace std; const int mxn = ;
const int mxm = ; inline void scan(string &s)
{
s.clear(); static char buf[mxm]; scanf("%s", buf); for (char *c = buf; *c; ++c)
s.push_back(*c);
} int n, m; int ord[mxn]; string str[mxn]; int end[mxm];
int son[mxm][]; int mini[mxm];
int maxi[mxm]; inline void insert(string &s, int id) {
static int tot = ; int p = , len = s.length(); for (int i = ; i < len; ++i) {
if (son[p][s[i] - 'a'] == )
son[p][s[i] - 'a'] = ++tot; p = son[p][s[i] - 'a'];
} end[p] = id;
} void getOrder(int p) {
static int cnt; mini[p] = cnt; if (end[p])
ord[++cnt] = end[p]; for (int i = ; i < ; ++i)
if (son[p][i])getOrder(son[p][i]); maxi[p] = cnt;
} int root[mxn]; int sum[mxm];
int nxt[mxm][]; void insert(int &t, int p, string &s, int d) {
static int tot = ; t = ++tot; sum[t] = sum[p] + ; memcpy(nxt[t], nxt[p], sizeof(nxt[t])); if (d < s.length())
insert(nxt[t][s[d] - 'a'], nxt[p][s[d] - 'a'], s, d + );
} inline void trie1(string &s, int <, int &rt, int ans) {
int p = , len = s.length(); for (int i = ; i < len; ++i)
s[i] = (s[i] - 'a' + ans) % + 'a'; lt = rt = ; for (int i = ; i < len; ++i)
p = son[p][s[i] - 'a']; lt = mini[p];
rt = maxi[p];
} inline void trie2(string &s, int lt, int rt, int &ans) {
int len = s.length(); reverse(s.begin(), s.end()); for (int i = ; i < len; ++i)
s[i] = (s[i] - 'a' + ans) % + 'a'; int a = root[lt], b = root[rt]; for (int i = ; i < len; ++i) {
a = nxt[a][s[i] - 'a'];
b = nxt[b][s[i] - 'a'];
} ans = sum[b] - sum[a];
} signed main(void) {
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
freopen("out", "w", stdout);
#endif scanf("%d", &n); for (int i = ; i <= n; ++i)
scan(str[i]); for (int i = ; i <= n; ++i)
insert(str[i], i); getOrder(); for (int i = ; i <= n; ++i)
reverse(str[i].begin(), str[i].end()); for (int i = ; i <= n; ++i)
insert(root[i], root[i - ], str[ord[i]], ); scanf("%d", &m); for (int i = , lt, rt, ans = ; i <= m; ++i) {
static string s1, s2; scan(s1);
scan(s2); trie1(s1, lt, rt, ans);
trie2(s2, lt, rt, ans); printf("%d\n", ans);
}
}
@Author: YouSiki
BZOJ 4212: 神牛的养成计划的更多相关文章
- BZOJ.4212.神牛的养成计划(Trie 可持久化Trie)
BZOJ 为啥hzw的题也是权限题啊 考虑能够匹配\(s1\)这一前缀的串有哪些性质.对所有串排序,能发现可以匹配\(s1\)的是一段区间,可以建一棵\(Trie\)求出来,设为\([l,r]\). ...
- BZOJ 4212: 神牛的养成计划 可持久化trie+trie
思路倒是不难,但是这题卡常啊 ~ code: #include <bits/stdc++.h> #define N 2000004 #define M 1000005 #define SI ...
- 【BZOJ-4212】神牛的养成计划 Trie树 + 可持久化Trie树
4212: 神牛的养成计划 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 136 Solved: 27[Submit][Status][Discus ...
- [BZOJ4212]神牛的养成计划
[BZOJ4212]神牛的养成计划 试题描述 Hzwer 成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神 ...
- 【BZOJ4212】神牛的养成计划 Trie树+可持久化Trie树
[BZOJ4212]神牛的养成计划 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变 ...
- BZOJ4212 神牛的养成计划 (字典树,bitset)
题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...
- BZOJ第1页养成计划
嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000 BZOJ1001 BZOJ1002 BZOJ1003 BZOJ1004 BZOJ1005 ...
- BZOJ第7页养成计划
嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1600 BZOJ1601 BZOJ1602 BZOJ1603 BZOJ1604 BZOJ1605 ...
- 【bzoj4212】神牛的养成计划
Portal --> bzoj4212 Description 给你\(n\)个字符串,接下来有\(m\)个询问,每个询问由两个给定的字符串\(s_1\)和\(s_2\)组成,对于每个询问输 ...
随机推荐
- Ubuntu 安装google chrome
sudo apt-get install google-chrome-stable /usr/bin/google-chrome-stable
- [转]zookeeper集群 initLimit和syncLimit
initLimit和syncLimit是针对集群的参数 1.tickTime:CS通信心跳数 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就 ...
- .net获取excel表的内容(OleDB方法)
首先引用组件和命名空间 using Microsoft.Office.Interop.Excel; using System.Data.OleDb; 然后把excel上传到指定路径 上传文件方法省略 ...
- Luogu P2827 蚯蚓
看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很naive的 注意在用堆做的时候也是要明智一点的,对于蚯蚓长度的相加肯定不能直接遍历并加上,还是可以差分一下的 其实说白了就是把集体加->单 ...
- gist.github.com 被墙无法访问解决办法
windows下 打开C:\Windows\System32\drivers\etc\hosts文件 编辑器打开,在最后行添加192.30.253.118 gist.github.com 保存.
- Centos7.2下OpenVPN 环境完整部署记录
关于OpenVPN的有关介绍及为何使用OpenVPN在此就不做赘述了,下面直接记录Centos7.2系统下部署OpenVPN环境的操作过程: 1) 先将本机的yum换成阿里云的yum源 [root@t ...
- 集群环境删除redis指定的key
1.说明 redis集群上有时候会需要删除多个key,就必须需要登录到每个节点上,而且有可能这个key不在这个节点,这样删除起来就比较麻烦,下面提供一种便捷方式可以实现 2.查看redis集群中的ma ...
- Linux内核分析 笔记八 进程的切换和系统的一般执行过程 ——by王玥
一.进程切换的关键代码switch_to的分析 (一)进程调度与进程调度的时机分析 1.不同类型的进程有不同的调度需求 第一种分类: I/O-bound:频繁地进行I/O,花费很多的时间等待I/O操作 ...
- Java开发异常
1.org.apache.catalina.LifecycleException 报错信息如下: 警告: Error during context [/wxqhbcloud] restart org. ...
- <构建之法>10,11,12章的读后感
第十章:典型用户和场景 问题 :什么是典型用户? 第十一章:软件设计与实现 问题 :开发人员的标准工作流程就是不断的发现BUg,修改bug来完善功能,在此过程中要等待同伴复审,在这阶段中,开发者应该如 ...