【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. linux服务之apache篇(一)

    1.apache介绍:使用率最高的网站服务器: URL:统一资源定位符: 端口:http:80   https:443 2.apache三种工作模式: prefork:一个线程处理一个请求(占用内存多 ...

  2. CSS笔试题

    如何实现移动端9宫格 如何实现移动端下列8宫格 实现移动端图片画廊CSS样式 写一个简单的animation的css动画 美化select,radio,range样式,只需考虑谷歌浏览器,下面给出的是 ...

  3. 移动端使用mint-ui loadmore实现下拉刷新上拉显示更多

    前序:在使用vue做一个h5项目的时候,需要上拉分页加载,实践中总结一下: 首先要安装mint-ui npm i mint-ui -S 然后引入,一般在main.js里面 import Vue fro ...

  4. 如何在ORACLE中查询某一用户下所有的空表

    先分析表 select 'analyze table '||table_name||' compute statistics;' from user_tables; 把查询结果依次执行 把所有表分析一 ...

  5. 201772020113李清华《面向对象程序设计(java)》第一周学习总结

    201772020113<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com b ...

  6. Python函数学习

    def func(x, y): print(x) print(y) func(x=1,2) #报错,关键参数一定不能放在位置参数前面 func(1,y=2) #可以正常运行 #参数组,适用于实参个数不 ...

  7. leetcode169

    public class Solution { public int MajorityElement(int[] nums) { Dictionary<int, int> dic = ne ...

  8. __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)

    自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = n ...

  9. CentOS内网机器利用iptables共享公网IP上网

    公司有个业务是2B的以及日活不大,所以两台服务器搞定,一个6M EIP.两台机器都是CentOS7系统EIP为 xxx.xxx.xxx.xxx绑在 内网ip为 172.18.30.175的服务器上,内 ...

  10. service mysqld start,Failed to start mysqld.service: Access denied

    service mysqld start 然后报: ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===Authentic ...