【solution】JZOJ-5795 词典

题面

Description

小C有$n$个字符串$T_1 T_n$,给出$m$个询问

第$i$个询问给出一个字符串$S_i$,对于每个询问,我们可以得到一个长度为$n$的$bool$数组$a$,其中$a_i=(S_i$是否为$T_i$的前缀$)$

例如,$a=[0,0,1]$表示$S_i$是$T_3$的前缀,但不是$T_1,T_2$的前缀。

对于每个询问给出的$a$数组,你的任务就是求出它最长的全$0$子串长度

Input

第一行两个数n,m,表示有n个字符串,m个询问。
接下来n行,每行一个字符串Ti 。
再接下来m行,每行一个字符串Si 。

Output

对于每个询问,输出一个ansi表示答案。

Sample Input

3 2
abcabc
aabc
abbc
aa
ba

Sample Output

1
3

Data Constraint




分割线




这是一个玄学的题目,有几种基于字典树(Trie)的做法,在考试的时候本蒟蒻在考场上一个小时一发手打出了数据不随机都没关系的在线做法,然鹅并没有什么卵用,统计的时候Trie爆了直接爆零




又是分割线




解法1:

这是一个离线做法(据说是标程???)

先读入数据(然鹅不用C++string难道不会爆数组吗)

再对查询建字典树,对模板串在字典树上跑一下,暴力求结果

解法2:

这貌似是一个在线的做法

对模板串建Trie,每次对询问串在字典树上跑一下,对下面的剩下部分暴力搜结果

这个的正确性就是因为数据是随机的,所以树高不会很大,因此就不会TLE了

正解来了!!!!

这是一个正常的玄学的做法,能够在不随机的数据上成功跑完,时间复杂度等于输入大小。考试的时候竟然被我想出来了(捂脸)

解题思路

对输入的模板串建一棵字典树,每个节点要存他的指向三个孩子的指针(这里用数组模拟),lst(上一次访问到这个节点的模板串编号,初始化为1),ans(这个节点的答案)。在每次添加模板串的时候暴力维护答案:如果当前访问的序号与上次的序号lst不相邻的话就用index-lst-1更新答案。在所有的模板串都添加完后再对所有的节点用n+1更新一下答案就可以了(这个很重要)。

查询的时候就把询问再字典树上跑一遍,如果不存在就直接输出n,存在的话就直接输出ans就好了

玄学的在线做法,复杂度是与输入规模相等的

121ms,119.50MB(主要是字典树节点)

(忽略注释掉的debug部分)

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define ll long long
#define maxn 1000005
using namespace std;
int n,m;
struct Trie{
int num;
int lst,ans;
int nxt[3];
Trie(){
lst=0;
ans=0;
nxt[0]=-1;
nxt[1]=-1;
nxt[2]=-1;
}
}node[maxn*5];
int tot=1;
char p[maxn*5];
int gmax(int a,int b){return a>b?a:b;}
void add(char a[],int index){
int len=strlen(a),np=0;
for(int i=0;i<len;i++){
int nc=a[i]-'a';//cout<<nc<<' ';
if(node[np].nxt[nc]==-1){
node[np].nxt[nc]=tot;
node[tot]=Trie();
node[tot].num=nc;
tot++;
//cout<<index<<endl;
}
//if(nc==1) cout<<index<<' '<<node[np]<<endl;
np=node[np].nxt[nc];
int last=node[np].lst;
if(index!=last+1){
int cnt=index-last-1;
node[np].ans=gmax(node[np].ans,cnt);
//cout<<index<<endl;
}
node[np].lst=index;
}
//cout<<endl;
return;
}
void update(){
int index=n+1;
for(int i=1;i<tot;i++){
int cnt=index-node[i].lst-1;
node[i].ans=gmax(node[i].ans,cnt);
}return;
}
int query(char a[]){
int len=strlen(a),np=0;
for(int i=0;i<len;i++){
int c=a[i]-'a';
if(node[np].nxt[c]==-1){
return n;
}
else{
np=node[np].nxt[c];
}
}
//cout<<np<<' ';
return node[np].ans;
}
int main(){
freopen("word.in","r",stdin);
freopen("word.out","w",stdout);
scanf("%d %d",&n,&m);
node[0]=Trie();
for(int i=1;i<=n;i++){
scanf("%s",p);
add(p,i);
//cout<<i<<' '<<node[480].ans<<endl;
}
update();
for(int i=1;i<=m;i++){
scanf("%s",p);
printf("%d\n",query(p));
}
//for(int i=0;i<tot;i++){
// cout<<i<<' '<<node[i].nxt[0]<<' '<<node[i].nxt[1]<<' '<<node[i].nxt[2]<<endl;
//}
//cout<<tot<<endl;
return 0;
}

[solution] JZOJ-5795 词典的更多相关文章

  1. [solution] JZOJ 5459. 密室

    [solution] JZOJ 5459. 密室 Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有$N$ 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的 ...

  2. 必应词典UWP版-开发小结

    摘要 必应词典UWP版已经上线2周了!相信有不少用户都已经体验过了吧!得益于Win10全新.强大的API,新版词典在性能上.UI体验上都有了大幅的提升,今天,小编就为大家讲讲必应词典UWP开发的故事. ...

  3. (已解决 7.8号)leecode 分词利用词典分词 word break

    不戚戚于贫贱,不汲汲于富贵      ---五柳先生 Given a string s and a dictionary of words dict, determine if s can be se ...

  4. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  5. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  6. [Swift]LeetCode720. 词典中最长的单词 | Longest Word in Dictionary

    Given a list of strings words representing an English Dictionary, find the longest word in words tha ...

  7. [Swift]LeetCode953. 验证外星语词典 | Verifying an Alien Dictionary

    In an alien language, surprisingly they also use english lowercase letters, but possibly in a differ ...

  8. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  9. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

随机推荐

  1. javascript常用工具类整理(copy)

    JavaScript常用工具类 类型 日期 数组 字符串 数字 网络请求 节点 存储 其他 1.类型 isString (o) { //是否字符串 return Object.prototype.to ...

  2. 导入数据库时报错1067 – Invalid default value for ‘字段名’

    最近把mysql升级到5.7了,wordpress导数据报错 Invalid default value for 'comment_date' 原因出在类似这样的语句 DROP TABLE IF EX ...

  3. SpringMVC Get请求传集合,前端"异步"下载excel 附SpringMVC 后台接受集合

    最近项目上管理后台需要自己做一部分js部分,之前都是前端来弄...碰到了下载excel,刚开始使用ajax,搞了好久发现不合适..下载不了,网上说ajax返回类型不支持二进制流.. 因此采用 wind ...

  4. 使用jQuery+huandlebars遍历中if判断

    兼容ie8(很实用,复制过来,仅供技术参考,更详细内容请看源地址:http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) & ...

  5. R语言-线图(二)

      1.线图示例 plot()为高水平作图命令,axis().lines().legend()都为低水平作图命令 > rain<-read.csv("cityrain.csv&q ...

  6. php json 写入 mysql 的例子

    $a['aaa']='aaaa'; $a['bbb']='bbb'; $a['ccc']='ccc'; $arr['step_name']='kfkf'; $arr['process_name']=' ...

  7. [剑指Offer]8-二叉树的下一个节点

    链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...

  8. @RequestBody配合@JsonFormat注解实现字符串自动转换成Date

    2018年08月28日 16:41:15 混合动力火锅 阅读数:440   在controller中使用@RequestBody可以自动将字符串转换成int或者将int转换成字符串,但是Date类型则 ...

  9. VBA汇总同目录下的所有工作簿数据到另一个工作簿,并进行统计

    Sub clData() Dim ComputerCount As Object tms = Timer p = ThisWorkbook.Path & "\" f = D ...

  10. 29.Mysql监控

    29.Mysql监控29.1 如何选择一个监控方案 29.1.1 选择何种监控方式 29.1.2 如何选择合适自己的监控工具29.2 常用网络监控工具 29.2.1 Cacti简介 29.2.2 Na ...