2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
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自动机)的更多相关文章
- Luogu P2292 [HNOI2004]L语言(Trie+dp)
P2292 [HNOI2004]L语言 题面 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章 \(T\) 是由若干小写字母构成. ...
- 【BZOJ1212】[HNOI2004]L语言 Trie树
[BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...
- [HNOI2004]L语言 trie树? Ac自动机? hash!!
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- BZOJ1212[HNOI2004]L语言——trie树+DP
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- 洛谷:P2292 [HNOI2004]L语言(DP+Trie树)
P2292 [HNOI2004]L语言 题目链接:https://www.luogu.org/problemnew/show/P2292 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有 ...
- 洛谷 P2292 [HNOI2004] L语言 解题报告
P2292 [HNOI2004] L语言 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章\(T\)是由若干小写字母构成.一个单词 ...
- [HNOI2004]L语言 字典树 记忆化搜索
[HNOI2004]L语言 字典树 记忆化搜索 给出\(n\)个字符串作为字典,询问\(m\)个字符串,求每个字符串最远能匹配(字典中的字符串)到的位置 容易想到使用字典树维护字典,然后又发现不能每步 ...
- 洛谷(cogs 1293/bzoj 1212) P2292 [HNOI2004]L语言
1293. [HNOI2004] L语言 ★★★ 输入文件:language.in 输出文件:language.out 简单对比时间限制:1 s 内存限制:162 MB [题目描述] ...
- 洛谷P2292 [HNOI2004]L语言
传送门 建好trie树 当$dp[j]==1$当且仅当存在$dp[k]=1$且$T[k+1,j]==word[i]$ 然后乱搞就行了 //minamoto #include<iostream&g ...
随机推荐
- Session Cookie Token Json-Web-Token
什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明"你是你自己"(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就 ...
- pytorch方面
(113条消息) Pytorch基础:Torch.mul.Torch.mm与Torch.matmul的异同_名字填充中的博客-CSDN博客_pytorch torch.mul (111条消息) pyt ...
- 【转】pringMVC+Hibernate+Spring 简单的一个整合实例
ref:http://langgufu.iteye.com/blog/2088355 SpringMVC又一个漂亮的web框架,他与Struts2并驾齐驱,Struts出世早而占据了一定优势,我在博客 ...
- 使用IDEA开发SpringBoot不加载application.yml配置文件的解决方案
1.如果启动项目不加载application.yml配置文件,那么请确认下是否应用了Resources为项目资源文件夹 2.如果项目起初是可以正常使用的,突然不知道改了什么,然后进行启动项目的时候不加 ...
- 用 Java 写一个线程安全的单例模式(Singleton)?
请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类.当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例.Java 中,使用枚举作为单例类是最简单的方式 ...
- ClassNotFoundException: javax.persistence.Converter
检查你的hibernate-jpa-2.0-api-1.0.0.final.jar,会发现javax.persitence包中没有Convert类. 解决办法:下载hibernate-jpa-2.1- ...
- Oracle入门基础(十三)一一java调用oracle存储过程
package demo; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultS ...
- 访问修饰符 public,private,protected,以及不写(默认) 时的区别?
修饰符 当前类 同 包 子 类 其他包 public √ √ √ √ protecte d √ √ √ × default √ √ × × private √ × × × 类的成员不写访问修饰时默认为 ...
- PRODUCER配置加载
1.入口 Kafka通过new一个KafkaProducer将配置项进行加载.将用户定义的properties作为参数,构造成一个ProducerConfig对象. public KafkaProdu ...
- 一个 Spring 的应用看起来象什么?
一个定义了一些功能的接口.这实现包括属性,它的 Setter , getter 方法和函数等.Spring AOP.Spring 的 XML 配置文件.使用以上功能的客户端程序.