P1470 最长前缀 Longest Prefix

                              P1470 最长前缀 Longest Prefix

 

题目描述

在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣。

如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素。元素不一定要全部出现(如下例中BBC就没有出现)。举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素:

{A, AB, BA, CA, BBC}

序列 S 的前面 K 个字符称作 S 中长度为 K 的前缀。设计一个程序,输入一个元素集合以及一个大写字母序列 S ,设S'是序列S的最长前缀,使其可以分解为给出的集合P中的元素,求S'的长度K。

输入输出格式

输入格式:

 

输入数据的开头包括 1..200 个元素(长度为 1..10 )组成的集合,用连续的以空格分开的字符串表示。字母全部是大写,数据可能不止一行。元素集合结束的标志是一个只包含一个 “.” 的行。集合中的元素没有重复。接着是大写字母序列 S ,长度为 1..200,000 ,用一行或者多行的字符串来表示,每行不超过 76 个字符。换行符并不是序列 S 的一部分。

 

输出格式:

 

只有一行,输出一个整数,表示 S 符合条件的前缀的最大长度。

 

输入输出样例

输入样例#1:
A AB BA CA BBC
.
ABABACABAABC
输出样例#1:
11

说明

翻译来自NOCOW

USACO 2.3

 

和  [HNOI2004]L语言  一样

 

 1 #include <cstring>
 2 #include <ctype.h>
 3 #include <cstdio>
 4 
 5 const int MAXN=200010;
 6 const int MAXM=210;
 7 
 8 int tot,Len;
 9 
10 char s[MAXM][12];
11 
12 char st[MAXN],pl[MAXN]; 
13 
14 int f[MAXN];
15 
16 bool b[MAXN];
17 
18 struct node {
19     int next[27];
20 };
21 node t[MAXN];
22 
23 inline void build(int p) {
24     int len=strlen(s[p]);
25     int now=0;
26     for(int i=0;i<len;++i) {
27         int x=s[p][i]-'A'+1;
28         if(!t[now].next[x]) t[now].next[x]=++tot;
29         now=t[now].next[x];
30     }
31     b[now]=true;
32     return;
33 }
34 
35 inline void lo() {
36     int len=strlen(pl);
37     for(int i=0;i<len;++i) st[++Len]=pl[i];
38 }
39 
40 int hh() {
41 //    freopen("prefix.in","r",stdin);
42 //    freopen("prefix.out","w",stdout);
43     int i=1;
44     while(scanf("%s",s[i])&&s[i][0]!='.')
45       build(i);
46     int ans;
47     while(~scanf("%s",pl)) lo();
48     f[0]=1;
49     for(int i=0;i<=Len;++i) {
50         if(f[i]!=true) continue;
51         else ans=i;
52         for(int now=0,j=i+1;j<=Len;++j) {
53             int x=st[j]-'A'+1;
54             now=t[now].next[x];
55             if(!now) break;
56             if(b[now]) f[j]=1;
57         }
58     }
59     printf("%d\n",ans);
60     return 0;
61 } 
62 
63 int sb=hh();
64 int main() {;}
代码

 

posted @ 2017-08-20 11:34  拿叉插猹哈  阅读(237)  评论(0编辑  收藏  举报