USACO Longest Prefix 【水】

用Dp的思想解决了这道题目,也就是所谓的暴力= =

题意:给出一个集合,一个字符串,找出这个字符串的最长前缀,使得前缀可以划分为这个集合中的元素(集合中的元素可以不全部使用)。

还不会Trie 树QAQ

Source Code:

/*
ID: wushuai2
PROG: prefix
LANG: C++
*/
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <vector>
#include <algorithm>
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define MOD 1000000007
#define pi acos(-1.0)
#define RV(num) ((num) > 0 ? 0 : 1)

using namespace std;

typedef long long           ll      ;
typedef unsigned long long  ull     ;
typedef unsigned int        uint    ;
typedef unsigned char       uchar   ;

template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}

const double eps = 1e-7      ;
const int M = 660000         ;
const ll P = 10000000097ll   ;
const int INF = 0x3f3f3f3f   ;
const int MAX_N = 20         ;
const int MAXSIZE = 101000000;

string str[220];
char a[2200000];
bool vis[220000];
int str_num, len, len_a;

int main() {
    ofstream fout ("prefix.out");
    ifstream fin ("prefix.in");
    int i, j, k, l, m, n, t, s, c, w, q, num;
    for(;;){
        fin >> str[++str_num];
        if(str[str_num].compare(".") == 0)  break;
    }
    while(fin >> a[len_a++])
    vis[0] = true;
    for(i = 0; i < len_a; ++i){
        if(!vis[i]) continue;
        for(j = 1; j < str_num; ++j){
            int length_str = str[j].length();
            if(length_str + i >= len_a)   continue;
            for(k = 0; k < length_str; ++k){
                if(a[i + k] != str[j][k])   break;
            }
            if(k == length_str){
                checkmax(len, length_str + i);
                vis[length_str + i] = true;
            }
        }
    }
    fout << len << endl;

    fin.close();
    fout.close();
    return 0;
}
时间: 2024-10-27 12:20:18

USACO Longest Prefix 【水】的相关文章

USACO Longest Prefix

题目大意:给出一个长字符串,问最长的前缀,使得这个前缀能用给出的一些元素组合而成 思路:暴力dp,dp[i]表示长度为i的前缀能否被表示 1 /*{ 2 ID:a4298442 3 PROB:prefix 4 LANG:C++ 5 } 6 */ 7 #include<iostream> 8 #include<fstream> 9 #include<cstring> 10 #include<algorithm> 11 #define maxn 109 12 u

usaco题目分享——Longest Prefix

Longest PrefixIOI'96 The structure of some biological objects is represented by the sequence of their constituents, where each part is denoted by an uppercase letter. Biologists are interested in decomposing a long sequence into shorter sequences cal

洛谷P1470 最长前缀 Longest Prefix

P1470 最长前缀 Longest Prefix 73通过 236提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 求大神指导,为何错? 题目描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定

Implement Trie and find longest prefix string list

1 package leetcode; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 class TrieNode{ 7 Boolean isWord;//true if path till this node represent a string. 8 Integer freq;//numbers of strings share the same prefix 9 Character nodeChar;//chara

Luogu P1470 最长前缀 Longest Prefix

Luogu P1470 最长前缀 Longest Prefix Portal(传送门) 注释 这道题与上一篇博客的题几乎一样 解析 有点麻烦的地方就是字符串的输入 方法一:类dp Code #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long using namespace std

【USACO 2.3】The Longest Prefix

题意: 给你一个少于200000的字符串,求最长的可以划分为给定词典里的单词的前缀. 题解: dp[i]表示第i位结尾的前缀是否可行,然后枚举每一位如果dp[i-1]==1,枚举所有单词,匹配成功的单词,则dp[i+单词长度-1]=1. 注意读入单词是以'.'作为结束,而读入字符串,有可能是很多行,要拼接一下. /* TASK:prefix LANG:C++ */ #include<cstdio> #include<cstring> #include<algorithm>

USACO Section2.3 Longest Prefix 解题报告 【icedream61】

prefix解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 给你许多子串P和一个长字符串S,请问S的前缀中能用这些子串(可以重复使用子串)组合的最长的一个长度是多少?[数据范围] P的长度在1-10之内,子串个数在1-200之内 S的长度在1

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排

bzoj usaco 金组水题题解(2.5)

bzoj 2197: [Usaco2011 Mar]Tree Decoration 树形dp..f[i]表示处理完以i为根的子树的最小时间. 因为一个点上可以挂无数个,所以在点i上挂东西的单位花费就是i所在子树里的最小单位花费.. 所以每次求f[i]只要使子树里的数量都满足要求就好了..i的祖先还要更多的话随时可以选某个节点多挂一些.. f[i]=sum{f[j]}+mincost[i]*max(need[i]-sum{need[j]},0)..(j是i的儿子,mincost[i]表示子树i里的