【BZOJ1212】【HNOI2004】L语言
2015-08-23 20:42
513 查看
挺简单的Trie加DP,直接贴代码:
[code]#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define maxl 1100010 using namespace std; char st[20],T[maxl]; int len; struct Trie{ int sz; int ch[300][30]; bool isw[300],f[maxl];//若f[i]=1表示长度为i的前缀可以在字典中得到理解 int idx(char c){return c-'a';} void init(){ sz=0; memset(ch,0,sizeof(ch)); memset(isw,0,sizeof(isw)); } void insert(char*s){ int u=0; for(int i=0;i<len;i++){ int c=idx(s[i]); if(!ch[u][c])ch[u][c]=++sz; u=ch[u][c]; } isw[u]=1; } int solve(char*T){ memset(f,0,sizeof(f)); f[0]=1; for(int i=0;i<len;i++)if(f[i])query(T,i); for(int i=len;~i;i--)if(f[i])return i; } void query(char*T,int l){ int u=0; for(int i=l;i<len;i++){ int c=ch[u][idx(T[i])]; if(!c)break; if(isw[c])f[i+1]=1; u=c; } } }P; int n,m; void getst(char*st){ len=0; for(char c=getchar();c!='\n'&&c!=EOF&&c!=' ';c=getchar())st[len++]=c; } int main(){ freopen("1212.in","r",stdin); scanf("%d%d",&n,&m); getchar(); P.init(); for(int i=0;i<n;i++){ getst(st); P.insert(st); } while(m--){ getst(T); printf("%d\n",P.solve(T)); } return 0; }
相关文章推荐
- ThinkPHP3.1.3部署到SAE 教程
- CCActionGird3D源码解析
- Linux 经常使用 性能 检测 命令 说明
- HDU 4407 Sum(容斥原理)
- POJ 1321 棋盘问题(深搜)
- [GDOI模拟2015.08.18]解密
- C/C++头文件注释
- 坚持不懈之linux haproxy 配置文件 详情
- windows 10 设置
- 位扩展和位截断
- [LeetCode] Search a 2D Matrix(二分查找)
- 不错的文章
- linux-fdisk/mke2fs/dumpe2fs/fsck
- linux内核移植和根文件系统制作(三)
- 安卓开发笔记二——软键盘弹出不遮挡布局的策略
- Selenium学习---(三)
- Mysql与Oracle区别
- 求某正整数重新打乱后最大数与最小数的差值
- 求二进制数中1的个数
- java基础-API-集合框架-Collection