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

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

题意:

给定一个字典D,你的程序需要判断若干段文章在字典D下是否能够被理解。 并给出其在字典D下能够被理解的最长前缀的位置。理解定义为这段文章可以拆成字典里的单词。单词数≤10且长度≤10,文章数≤20且长度≤1M。

题解:

在trie上跑dp,dp[i]表示文章能否匹配到i这个位置。对于每个i,如果dp[i-1]为1,则从s[i]开始在trie上走,走过的节点数+i的dp值都置为1。

代码:

1 #include 
2 #include
3 #include
4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define maxn 200 6 using namespace std; 7 8 int ch[maxn][26],n,m,sz; bool d[maxn*10000],val[maxn]; char s[maxn*10000]; 9 void insert(char *s){10 int l=strlen(s+1),x=0;11 inc(i,1,l){12 if(!ch[x][s[i]-'a'])ch[x][s[i]-'a']=++sz; x=ch[x][s[i]-'a'];13 }14 val[x]=1;15 }16 int main(){17 scanf("%d%d",&n,&m); inc(i,1,n)scanf("%s",s+1),insert(s);18 inc(i,1,m){19 memset(d,0,sizeof(d)); scanf("%s",s+1); int l=strlen(s+1); d[0]=1;20 inc(i,1,l)if(d[i-1]){21 int x=0,y=i;22 while(s[y]-'a'>=0&&ch[x][s[y]-'a']){23 x=ch[x][s[y]-'a']; if(val[x])d[y]=1; y++;24 }25 }26 while(!d[l])l--; printf("%d\n",l);27 }28 return 0;29 }

 

20160617

转载于:https://www.cnblogs.com/YuanZiming/p/5779915.html

你可能感兴趣的文章
压位高精
查看>>
655. Print Binary Tree
查看>>
jsp 中对jar 包的引用
查看>>
python操作mysql数据库
查看>>
Yii: gii 403 Error you are not allowed to access this page
查看>>
Android SVG矢量资源的使用方法
查看>>
计算汉字长度
查看>>
RSA签名验签学习笔记
查看>>
Codeforces 911E - Stack Sorting
查看>>
BZOJ 1853: [Scoi2010]幸运数字
查看>>
Pessimistic and optimistic locking
查看>>
基于敏捷的测试交付物通用设计
查看>>
svn变更自动触发jenkins构建工程-简单版
查看>>
BFS --- 素数环
查看>>
for循环每次取出一个字符(不是字节)
查看>>
linux版本选择
查看>>
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
查看>>
Java DynamoDB 增加、删除、修改、查询
查看>>
【转】linux下 postgres的一些操作总结
查看>>
不写for也能选中checkbox!
查看>>