P2292 [HNOI2004]L语言

题目链接:https://www.luogu.org/problemnew/show/P2292

题目描述

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

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

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

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

输入输出格式

输入格式:

输入文件第一行是两个正整数n和m,表示字典D中有n个单词,且有m段文章需要被处理。之后的n行每行描述一个单词,再之后的m行每行描述一段文章。

其中1<=n, m<=20,每个单词长度不超过10,每段文章长度不超过1M。

输出格式:

对于输入的每一段文章,你需要输出这段文章在字典D可以被理解的最长前缀的位置。

输入输出样例

输入样例#1:

4 3
is
name
what
your
whatisyourname
whatisyouname
whaisyourname
输出样例#1:

14  (整段文章’whatisyourname’都能被理解)
6 (前缀’whatis’能够被理解)
0 (没有任何前缀能够被理解)

题解:

由于题目要求的是连续的前缀都需要在字典中得到匹配,那么可以直接联想到Trie树可以为我们节约匹配的时间。

要求长度最大的话,直接dp转移即可,取最大值就行了。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n,m;
char s[N];
int dp[N];
struct Aho_Corasick{
int Size;
int ch[N][];
int val[N];
int fail[N];
void init(){
Size=-;
newnode();
}
int newnode(){
memset(ch[++Size],,sizeof(ch[]));
val[Size]=fail[Size]=;
return Size;
}
void insert(char *s){
int l=strlen(s);
int u=;
for(int i=;i<l;i++){
int idx=s[i]-'a';
if(!ch[u][idx]) ch[u][idx]=newnode();
u=ch[u][idx];
}
val[u]++;
}
int query(char *s,int id){
int l=strlen(s+);
dp[]=id;
int ans=,u=;
for(int i=;i<=l;i++){
if(dp[i]!=id&&i) continue ;
u=;
for(int j=i+;j<=l;j++){
int idx=s[j]-'a';
if(ch[u][idx]==) break ;
u=ch[u][idx];
if(val[u]) ans=max(ans,j),dp[j]=id;
}
}
return ans ;
}
}ac;
int main(){
cin>>n>>m;
ac.init();
for(int i=;i<=n;i++){
scanf("%s",s);
ac.insert(s);
}
for(int i=;i<=m;i++){
scanf("%s",s+);
printf("%d\n",ac.query(s,i));
} return ;
}

最新文章

  1. Linux C--信号 sigaction函数
  2. android 得到缩略图
  3. Angular JS 学习之路由
  4. c++ 覆盖、重载与隐藏
  5. cf.301.D. Bad Luck Island(dp + probabilities)
  6. SharePoint 2013 &quot;通知我&quot;功能简介
  7. 传智168期JavaEE就业班 day04-dom
  8. Clr core
  9. 06-CABasicAnimation基础核心动画
  10. PNG兼容IE6解决方法
  11. 2-23c#基础循环语句
  12. 基于Java SE的模拟双色球彩票系统
  13. 201521123105 第11周Java学习总结
  14. 使用Git将本地项目或代码上传到GitHub上
  15. robot启动
  16. 类加载, 静态变量初始化, String不可变, 泛型使用, 内部类
  17. Luogu 1903 数颜色 | 分块
  18. 一文学会用 Tensorflow 搭建神经网络
  19. HTML5学习笔记(十二):JavaScript新增Map和Set
  20. 面向对象之ajax

热门文章

  1. 软件工程第六周psp
  2. 什么是Processing
  3. [zt]手把手教你写对拍程序(PASCAL)
  4. lintcode-28-搜索二维矩阵
  5. iOS开发改变字符串中指定字符颜色,大小等等
  6. TCP系列08—连接管理—7、TCP 常见选项(option)
  7. grid++json页面数据传入
  8. 【Mysql】- Mysql 8.0正式版新亮点
  9. C# #pragma warning disable/restore
  10. Spyder5 &amp; 显示器校准 &amp; 色彩校准