博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【[HNOI2004]L语言】
阅读量:4331 次
发布时间:2019-06-06

本文共 1468 字,大约阅读时间需要 4 分钟。

\(Trie\)树+\(DP\)

我们只需要做一个存在性dp就好了

对于每一个字符串,我们设\(f[i]\)表示从\(1\)\(i\)位是否能被完全匹配

首先\(f[0]=1\),之后我们对于每一个\(f[i]=1\)我们都可以往下匹配

具体的匹配方法自然是丢到\(Trie\)树上去,从\(i\)这位开始,一旦遇到一个结束标记就将这个结束标记对应位置的\(f[x]=1\),之后就可以了

#include
#include
#include
#define re register#define maxn 1000005char S[maxn];int son[505][27],flag[505];char T[11];int cnt;bool f[maxn];inline int read(){ char c=getchar(); int x=0; while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar(); return x;}int n,m;inline void ins(){ int len=strlen(T+1); int now=0; for(re int i=1;i<=len;i++) { if(!son[now][T[i]-'a']) son[now][T[i]-'a']=++cnt; now=son[now][T[i]-'a']; } flag[now]=1;}inline void check(int x,int len){ int now=0; for(re int i=x;i<=len;i++) { if(!son[now][S[i]-'a']) return; now=son[now][S[i]-'a']; if(flag[now]) f[i]=1; }}int main(){ n=read();m=read(); for(re int i=1;i<=n;i++) { scanf("%s",T+1); ins(); } for(re int t=1;t<=m;t++) { scanf("%s",S+1); memset(f,0,sizeof(f)); f[0]=1; int len=strlen(S+1); int ans=0; for(re int i=0;i<=len;i++) { if(!f[i]) continue; ans=i; check(i+1,len); } if(!ans) puts("-1"); else printf("%d",ans),putchar(10); } return 0;}

转载于:https://www.cnblogs.com/asuldb/p/10207776.html

你可能感兴趣的文章
点云PCL中小细节
查看>>
铁路信号基础
查看>>
RobotFramework自动化2-自定义关键字
查看>>
[置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了
查看>>
BABOK - 需求分析(Requirements Analysis)概述
查看>>
第43条:掌握GCD及操作队列的使用时机
查看>>
Windows autoKeras的下载与安装连接
查看>>
CMU Bomblab 答案
查看>>
微信支付之异步通知签名错误
查看>>
2016 - 1 -17 GCD学习总结
查看>>
linux安装php-redis扩展(转)
查看>>
Vue集成微信开发趟坑:公众号以及JSSDK相关
查看>>
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>
P1313 计算系数
查看>>
NSString的长度比较方法(一)
查看>>
Azure云服务托管恶意软件
查看>>
My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
查看>>
旧的起点(开园说明)
查看>>