`
zqynux
  • 浏览: 36850 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

USACO Longest Prefix最长前缀

阅读更多
Longest Prefix
IOI'96
The structure of some biological objects is represented by the sequence of their constituents denoted by uppercase letters. Biologists are interested in decomposing a long sequence into shorter ones called primitives.

We say that a sequence S can be composed from a given set of primitives P if there is a some sequence of (possibly repeated) primitives from the set whose concatenation equals S. Not necessarily all primitives need be present. For instance the sequence ABABACABAABcan be composed from the set of primitives

   {A, AB, BA, CA, BBC}

The first K characters of S are the prefix of S with length K. Write a program which accepts as input a set of primitives and a sequence of constituents and then computes the length of the longest prefix that can be composed from primitives.

PROGRAM NAME: prefix
INPUT FORMAT
First, the input file contains the list (length 1..200) of primitives (length 1..10) expressed as a series of space-separated strings of upper-case characters on one or more lines. The list of primitives is terminated by a line that contains nothing more than a period (`.'). No primitive appears twice in the list. Then, the input file contains a sequence S (length 1..200,000) expressed as one or more lines, none of which exceed 76 letters in length. The "newlines" are not part of the string S.
SAMPLE INPUT (file prefix.in)
A AB BA CA BBC
.
ABABACABAABC

OUTPUT FORMAT
A single line containing an integer that is the length of the longest prefix that can be composed from the set P.
SAMPLE OUTPUT (file prefix.out)
11

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

如果一个集合 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


============================ 华丽的分割线 ============================
  前两天写出来了,, 忘记发日志了`
  感觉用的这个方法不像是DP(对于DP我还没有特别清楚的概念..),, 其中pre变量存储所有的匹配串(即短的那个字符串.), str是住串(长的那个.), 接下来最关键的是lenth这个变量,, (感觉名字没取好), 这个主串假设分为分为a1 a2 a3 ... an, lenth[i]如果是1的话代表在a1 a2 a3 .. ai 都是能够在匹配串匹配..
  说了一些云里雾里的话吧,, 废话不多,, 代码上:
/*
LANG: C
ID: zqy11001
PROG: prefix
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define getstr(s) scanf("%s", s)
char pre[401][11];
int m;

char lenth[200001];
char str[200000];
int n;

int main(void)
{
	int i, j, k;
	int best = 0;
	freopen("prefix.in", "r", stdin);
	freopen("prefix.out", "w", stdout);
	while(1){
		getstr(pre[m]);
		if(pre[m][0] == '.'){
			break;
		}
		m++;
	}
	while(getstr(str + n) == 1){
		n += strlen(str + n);
	}
	lenth[0] = 1;
	best = 0;
	for(i = 0; i < n; i++){
		if(lenth[i]){
			best = i;
			for(j = 0; j < m; j++){
				for(k = 0; ((i + k) < n) && (pre[j][k] != '\0') && 
					(pre[j][k] == str[i + k]); k++){
					;
				}
				if(pre[j][k] == '\0'){
					lenth[i + k] = 1;
				}
			}
		}
	}
	if (lenth[n])
		best = n;
	printf("%d\n", best);
	return 0;
}
0
0
分享到:
评论

相关推荐

    USACO题解+代码+翻译

    USACO,全称United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者的算法设计、编程能力和问题解决能力。本压缩包包含了USACO比赛的题解、源代码以及对应的中文翻译,对于想要...

    usaco.rar_USACO 翻译 下载_usaco _usaco 翻译

    USACO,全称为United States阿Olympiad in Informatics,是美国计算机奥林匹克竞赛,旨在为高中生提供一个学习和展示编程技能的平台。这个比赛涵盖了算法、数据结构以及问题解决等多个方面,对于想要深入理解计算机...

    USACO题集及答案

    3. **动态规划**:解决许多具有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列、矩阵链乘法等。 4. **字符串处理**:KMP算法、后缀数组、Manacher算法等用于字符串匹配和操作。 5. **数学**:数论(质...

    USACO英汉对照题目

    第三章涉及的题目如 "Longest Prefix"、"Cow Pedigrees" 和 "Money Systems",则可能包含字符串处理、图论和抽象数据类型,例如树和图的遍历。 第四章和第五章的题目,如 "Beef McNuggets"、"Fence Rails"、"Job ...

    usaco 2010-2011

    ### USACO 2010-2011 季度竞赛概览与关键信息 #### 一、概述 美国计算机奥林匹克(USACO)是面向全球中学生的计算机科学竞赛,旨在发掘并培养计算机科学领域的年轻人才。USACO 2010-2011 季度竞赛于 2010 年 11 月...

    usaco 合集usaco 合集usaco 合集

    《USACO 合集:全面解析与学习指南》 USACO,全称为USA Computing Olympiad,是一项针对中学生举办的在线编程竞赛,旨在提升参赛者的算法设计和问题解决能力。这个合集提供了丰富的资源,包括英文原题、中文译题、...

    USACO做题代码

    8. **模板和技巧**:如快速幂、 Fenwick树(区间求和)、前缀和、线段树等,熟练掌握这些可以提高解题速度。 9. **调试技巧**:学会使用调试工具,理解错误并修复它们是解决问题的关键。 10. **编程规范**:良好的...

    USACO翻译及题解

    USACO,全称United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者在算法设计、问题解决以及计算机科学基础方面的技能。这个压缩包文件提供了丰富的资源,帮助参赛者或学习者更好...

    USACO全部测试数据.zip

    3. **动态规划**:用于解决最优化问题,如背包问题、最长公共子序列等。 4. **图论**:最小生成树(Prim或Kruskal算法)、最短路径(Dijkstra或Floyd-Warshall算法)。 5. **字符串处理**:模式匹配(KMP算法、Rabin...

    usaco traning全部数据

    【标题】"usaco traning全部数据" 涉及的是一个编程竞赛训练平台——USACO(USA Computing Olympiad)的数据集。USACO是一个专门为美国中学生设计的在线编程竞赛,旨在提升参赛者的算法设计和编程能力,特别是在解决...

    USACO-Chapter1.rar_it_usaco

    《USACO入门指南——第一章解析》 USACO,全称USA Computing Olympiad,是美国计算机奥林匹克竞赛,旨在培养中学生在算法和编程方面的技能。对于初学者来说,USACO提供了很好的学习路径和挑战。本文将针对USACO的第...

    USACO答案及详解

    某些USACO题目的答案,很详细,代码清晰结构良好,算法高效易于调试

    usaco心得及总结

    ### USACO心得及总结 #### 第一部分 动态规划 **USACO**(美国计算机奥林匹克竞赛)作为一项国际知名的编程竞赛,不仅考验参赛者的编程能力,还对其算法理解和应用有着极高的要求。其中,动态规划(Dynamic ...

    usaco历年测试数据

    USACO(美国计算机奥林匹克竞赛)是面向全球中学生的一项编程竞赛,主要涉及算法和问题解决能力。这个压缩包文件“usaco历年测试数据”包含了该赛事历年的测试题目和样例输入输出数据,这对于参赛者准备比赛或者提升...

    USACO 1.1 c++源程序

    USACO,全称为United States Computer Olympiad,是一项面向中学生的国际性计算机编程竞赛,旨在提升参赛者的算法设计和编程能力。USACO比赛通常使用C++语言进行,因此"USACO 1.1 c++源程序"指的是USACO入门阶段1.1...

    USACO历年比赛测试数据:2004年

    USACO,全称United States Computer Olympiad,是美国计算机奥林匹克竞赛,是一项旨在培养青少年编程技能和算法理解的国际性比赛。这个比赛对于有志于在计算机科学领域深入发展的学生来说,具有很高的学习价值和挑战...

    USACO全部题目官方分析翻译

    在USACO题目中,动态规划的运用可以解决背包问题、最长公共子序列等问题。 3. **数据结构**:二叉树、平衡树(AVL、红黑树)、图、队列、栈等数据结构的运用也是竞赛的重点。例如,二叉查找树在快速查找和插入中起...

    USACO历年比赛测试数据:2003年

    USACO(USA Computing Olympiad)是美国计算机奥林匹克竞赛,是一项面向中学生的编程竞赛,旨在提升学生的算法设计、编程和问题解决能力。该比赛通常包括训练营和一系列在线比赛,最终选拔出优秀选手代表美国参加...

    USACO全部测试数据

    《USACO全部测试数据详解》 USACO,全称United States Computer Olympiad,是美国计算机奥赛,是一项旨在提升青少年计算机编程能力的竞赛。该竞赛覆盖了基础算法、数据结构、问题解决等多个计算机科学的重要领域,...

    usaco_training code

    【标题】"USACO训练代码" USACO(USA Computing Olympiad)是美国计算机奥林匹克竞赛,旨在提高高中生的算法编程能力。这个压缩包“usaco_training code”包含的是一系列用于USACO培训的代码,由作者亲自编写。通过...

Global site tag (gtag.js) - Google Analytics