【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108422
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

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

如果一个集合 P 中的元素可以通过串联(允许重复;串联,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素。并不是所有的元素都必须出现。举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素:

{A, AB, BA, CA, BBC}

序列 S 的前面 K 个字符称作 S 中长度为 K 的前缀。设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列中(由集合元素组成的)最长的前缀的长度。

格式

PROGRAM NAME: prefix
INPUT FORMAT

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

OUTPUT FORMAT
只有一行,输出一个整数,表示 S 能够分解成 P 中元素的最长前缀的长度。

SAMPLE INPUT (file prefix.in)
A AB BA CA BBC
.
ABABACABAABC

SAMPLE OUTPUT (file prefix.out)
11

【参考程序】:

/*
ID: XIONGNA1
PROG: prefix
LANG: C++
*/
#include
<iostream>
#include
<cstring>
using namespace std;
string a[201];
bool bo[200001];
string str;
int n,len;
bool tf(char c)
{
    
if (c>='A' && c<='Z'return true;
    
return false;
}
bool check(int p)
{
    
int t;
    
for (int i=1;i<=n;i++)
    {
        t
=a[i].length();
        
if (p>=t)
        {
            
if (a[i]==str.substr(p-t+1,t))
                
if (bo[p-t]) return true;
        }
    }
    
return false;
}
int main()
{
    freopen(
"prefix.in","r",stdin);
    freopen(
"prefix.out","w",stdout);
    
string s; n=0;
    
while (cin>>s,s!=".")
    {
        n
++; a[n]=s;
    }
    
int x1,x2;
    str
=' '; len=0;
    
while (cin>>s)
    {
        x1
=0;x2=s.length()-1;
        
while (!tf(s[x1])) x1++;
        
while (!tf(s[x2])) x2--;
        str
+=s.substr(x1,x2-x1+1); len+=x2-x1+1;
    }
    memset(bo,
false,sizeof(bo));
    bo[
0]=true;
    
for (int i=1;i<=len;i++)
        
if (check(i)) bo[i]=true;
        
else bo[i]=false;
    
for (int i=len;i>=0;i--)
        
if (bo[i])
        {
            cout
<<i<<endl; break;
        }    
    
return 0;
}
posted on 2009-07-20 09:06 开拓者 阅读(371) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理