最长前缀
来源:互联网 发布:mac桌面文件夹 编辑:程序博客网 时间:2024/06/05 09:47
最长前缀
Description
一些生物体的复杂结构可以用其基元的序列表示,而一个基元用一个大写英文字符串表示。
生物学家的一个问题就是一个这样的长序列分解为基元(字符串)的序列。对于给定的基元集合
在从
例如,序列
字符串的前
请写一个程序,对于输入的基元集合
Input
第一行是基元集合
随后一行是一个长度为
每个基元互不相同。
最后一行描述要处理的字符串
Output
只有一行,一个数字,表示可以由
Sample Input
5
1
A
2
AB
3
BBC
2
CA
2
BA
ABABACABAABCB.
Sample Output
11
Solution
设
则对于
这个过程可以用
Code
#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct Node{ int nxt[27]; bool end; Node(){ memset(nxt,-1,sizeof nxt); end=false; }}Trie[100010];int n,top=1;char s[50];char t[500010];bool f[500010];void push(int len){ int now=1; for(int i=0;i<len;i++){ if(Trie[now].nxt[s[i]-'0']!=-1)now=Trie[now].nxt[s[i]-'0']; else{ Trie[now].nxt[s[i]-'0']=++top; now=top; } } Trie[now].end=true;}void find(char *str,int len,int start){ int now=1,i; for(i=0;i<len;i++){ if(Trie[now].nxt[str[i]-'0']!=-1)now=Trie[now].nxt[str[i]-'0']; else break; if(Trie[now].end)f[start+i]=true; }}int main(){ freopen("prefix.in","r",stdin); freopen("prefix.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ int l; scanf("%d%s",&l,s); push(l); } scanf("%s",t); int rl=strlen(t),i; rl--; for(i=0;i<rl;i++){ if(i==0||f[i-1])find(t+i,rl-i,i); } for(i=rl-1;i>=0;i--)if(f[i]){ printf("%d\n",i+1); return 0; } return 0;}
- 最长前缀
- 最长前缀
- 最长的前缀
- 最长公共前缀
- 字符串最长前缀
- 最长公共前缀
- LintCode-最长公共前缀
- LintCode 最长公共前缀
- (78)最长公共前缀
- 最长公共前缀_LinkCode
- 最长公共前缀
- lintcode ---- 最长公共前缀
- 最长公共前缀
- 最长回文串前缀
- LintCode : 最长公共前缀
- lintcode,最长公共前缀
- 【LeetCode】最长相同前缀
- 最长公共前缀
- asp.net获取当前页面的url地址
- 调用readLine的乱码问题
- DNS的几个基本概念:
- GeekBand c++學習筆記之七(仿函數與適配器)
- SQLSERVER角色权限
- 最长前缀
- windows下 android studio 的NDK开发环境配置(2)
- 软件测试实习0624-TestNG依赖测试
- 输出格式
- 学习Javascript 网址
- PrintStream
- Wifi连接有密码的SSID是wifiManager.addNetwork返回为-1
- IntelliJ Idea 常用快捷键列表
- SQL 注入