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. Python的安装与开发环境的选用

    2021快要结束了,这一年我依旧深耕于python的广阔土壤,将重点放在机器人和传感器的角度.也收获了一大批正在学习和期望学习python的朋友. 正在学习的暂且不言,这篇主要是写给期望学习的朋友,同 ...

  2. XML约束DTD

    <元素1> <元素2> <元素3>描述1</元素3> <元素4>描述2</元素4> </元素2> </元素1& ...

  3. Dubbo 配置文件是如何加载到 Spring 中的?

    Spring 容器在启动的时候,会读取到 Spring 默认的一些 schema 以及 Dubbo 自 定义的 schema,每个 schema 都会对应一个自己的 NamespaceHandler, ...

  4. kafka的message格式是什么样的?

    一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成 ...

  5. BMZCTF 2020祥云杯到点了

    2020祥云杯到点了 下载附件得到三个word文档,我们打开第一个文档然后将隐藏文字显示出来 得到提示 我们查看属性应该就是日期了我们先把他记录下来 然后打开第二个文档 输入刚刚的密码 在第二个wor ...

  6. BMZCTF SDNISC2020_过去和现在

    SDNISC2020_过去和现在 打开附件就一张图片 根据题意感觉是图片中隐藏了什么信息 使用binwalk -e分离这里foremost不行 三个文件查看在第一个中发现flag

  7. 单片机ram和rom的区别

    单片机运行时需要调用某个程序/函数/固定数据时就需要读取ROM,然后在RAM中执行这些程序/函数的功能,所产生的临时数据也都存在RAM内,断电后这些临时数据就丢失了.ROM:(Read Only Me ...

  8. 用AltiumDesigner画完PCB生成gerber(光绘)文件详细说明

    什么是gerber文件             Gerber文件是所有电路设计软件都可以产生的文件,在电子组装行业又称为模版文件(stencil data),在PCB制造业又称为光绘文件.可以说Ger ...

  9. 《基于.NET Core构建微服务》系列文章(更新至第6篇,最新第7篇,已发布主页候选区)

    原文:Building Microservices On .NET Core – Part 1 The Plan 时间:2019年1月14日 作者:Wojciech Suwała, Head Arch ...

  10. 在小程序Canvas中使用measureText

    有时候我们在使用Canvas绘制一段文本时,会需要通过measureText()方法获取文本的宽度,例如: 创建canvas标签 <canvas id="canvas"> ...