2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

https://www.luogu.com.cn/problem/P2292

题意:

标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的。现在你要处理的就是一段没有标点的文章。

一段文章 TT 是由若干小写字母构成。一个单词 WW 也是由若干小写字母构成。一个字典 DD 是若干个单词的集合。我们称一段文章 TT 在某个字典 DD 下是可以被理解的,是指如果文章 TT 可以被分成若干部分,且每一个部分都是字典 DD 中的单词。

例如字典 DD 中包括单词is,name,what,your则文章whatisyourname 是在字典 DD 下可以被理解的,因为它可以分成 44 个单词:what,is,your,name,且每个单词都属于字典 D,而文章 whatisyouname 在字典 D下不能被理解,但可以在字典 D' =D∪{you} 下被理解。这段文章的一个前缀whatis,也可以在字典 D下被理解,而且是在字典 D下能够被理解的最长的前缀。

给定一个字典 D,你的程序需要判断若干段文章在字典 D下是否能够被理解。并给出其在字典 D下能够被理解的最长前缀的位置。

分析:

模板。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define aa 2000010
int n,m;
char p[aa];
map<string,int>a;
map<string,int>b;
struct trie{
int ch[aa][30],vis[aa],cnt,flag[aa];
inline void clear(){
memset(ch,0,sizeof(ch));
memset(vis,0,sizeof(vis));
cnt=0;
}
inline void insert(char *s){
int u=0,l=strlen(s+1);
//len=max(len,l);
for(int i=1;i<=l;i++){
int si=s[i]-'a';
if(ch[u][si]==0){
++cnt;
ch[u][si]=cnt;
}
u=ch[u][si];
}
flag[u]=1;
}
/*inline bool find(int start,int end){
int u=0;
for(int i=start;i<=end;i++){
int si=p[i]-'a';
if(ch[u][si]==0)return 0;
u=ch[u][si];
}
return vis[u];
}*/
inline int find(char *s){
int u=0,l=strlen(s+1);
if(a[s+1])return b[s+1];
memset(vis,0,sizeof(vis));
vis[0]=1;
for(int i=0;i<=l;i++){
if(vis[i]==0)continue;
cnt=i;
for(int j=i+1;j<=l;j++){
int si=s[j]-'a';
u=ch[u][si];
if(u==0)break;
if(flag[u])vis[j]=1;
}
}
a[s+1]=1;b[s+1]=cnt;
return cnt;
}
}t;
inline int read(){
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s;
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++){
scanf("%s",p+1);
t.insert(p);
}
for(int i=1;i<=m;i++){
scanf("%s",p+1);
/*memset(f,0,sizeof(f));
int l=strlen(p),ans=0;
for(int j=0;j<l;j++){
for(int k=max(j-len,-1);k<=j;k++){
if((k==-1||f[k])&&t.find(k+1,j) ){
f[j]=1;ans=j+1;
break;
}
}
}
cout<<ans<<endl;*/
cout<<t.find(p)<<endl;
}
return 0;
}

2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)的更多相关文章

  1. Luogu P2292 [HNOI2004]L语言(Trie+dp)

    P2292 [HNOI2004]L语言 题面 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章 \(T\) 是由若干小写字母构成. ...

  2. 【BZOJ1212】[HNOI2004]L语言 Trie树

    [BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...

  3. [HNOI2004]L语言 trie树? Ac自动机? hash!!

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...

  4. BZOJ1212[HNOI2004]L语言——trie树+DP

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...

  5. 洛谷:P2292 [HNOI2004]L语言(DP+Trie树)

    P2292 [HNOI2004]L语言 题目链接:https://www.luogu.org/problemnew/show/P2292 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...

  6. 洛谷 P2292 [HNOI2004] L语言 解题报告

    P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...

  7. [HNOI2004]L语言 字典树 记忆化搜索

    [HNOI2004]L语言 字典树 记忆化搜索 给出\(n\)个字符串作为字典,询问\(m\)个字符串,求每个字符串最远能匹配(字典中的字符串)到的位置 容易想到使用字典树维护字典,然后又发现不能每步 ...

  8. 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言

    1293. [HNOI2004] L语言 ★★★   输入文件:language.in   输出文件:language.out   简单对比时间限制:1 s   内存限制:162 MB [题目描述] ...

  9. 洛谷P2292 [HNOI2004]L语言

    传送门 建好trie树 当$dp[j]==1$当且仅当存在$dp[k]=1$且$T[k+1,j]==word[i]$ 然后乱搞就行了 //minamoto #include<iostream&g ...

随机推荐

  1. Monkey的参数及简单使用

    什么是Monkey? Monkey是Android SDK提供的一个命令行工具,可以简单方便的发送伪随机的用户事件流,对Android APP做压力(稳定性)测试.主要是为了测试app是否存在无响应和 ...

  2. 亚马逊云储存器S3 BCUKET安全性学习笔记

    亚马逊云储存器S3 BCUKET安全性学习笔记 Bugs_Bunny CTF – Walk walk CTF 昨天玩了会这个比赛,碰到这题是知识盲点,来记录一下. 先从题目看起吧. http://ww ...

  3. HMS Core 机器学习服务6.4.0版本更新啦,文本翻译功能增加10种小语种语言类型!

    近日,HMS Core机器学习服务(ML Kit)文本翻译功能在6.4.0版本更新中增加了10种小语种语言类型,分别是马其他语.马其顿.冰岛.乌尔都语.波斯尼亚语.乌克兰语.加泰罗尼亚语.斯洛文尼亚语 ...

  4. JVM内存模型——堆(heap)、栈(stack)和方法区(method)

      JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:堆内存用于存放由new创建的对象和数组.堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的 ...

  5. React算法复杂度优化?

    react树对比是按照层级去对比的, 他会给树编号0,1,2,3,4.... 然后相同的编号进行比较.所以复杂度是n,这个好理解. 关键是传统diff的复杂度是怎么算的?传统的diff需要出了上面的比 ...

  6. 解释内存中的栈(stack)、堆(heap)和方法区(method area) 的用法?

    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的 现场保存都使用 JVM 中的栈空间:而通过 new 关键字和构造器创建的对象则放在 堆空间,堆是垃圾收集器管理的主要区域,由于现 ...

  7. 为什么 Thread 类的 sleep()和 yield ()方法是静态的?

    Thread 类的 sleep()和 yield()方法将在当前正在执行的线程上运行.所以在其他处于等待状态的线程上调用这些方法是没有意义的.这就是为什么这些方法是静态的.它们可以在当前正在执行的线程 ...

  8. Linux Yum仓库源配置

    Yum概念:Yum软件仓库的作用是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其依赖关系的技术 Yum配置仓库源放置位置:/etc/yum.repo.d/ :配置文件需以 .repo 结 ...

  9. SpringCloud个人笔记-02-Feign初体验

    项目结构 sb_cloud_product <?xml version="1.0" encoding="UTF-8"?> <project x ...

  10. State Lattice Planner(状态栅格规划)

    参考文献: Efficient constrained path planning via search in state lattices Differentially Constrained Mo ...