题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681

  题意:给A,B,C三个串,求一个最长的串D,满足D是A和B的subsequence,C是D的substring。。

  比赛那天把substing搞成了subsequence,,,sd。。。

  挺水的一题,直接枚举C在A和B串中的位置,当然是最短的位置,然后求两遍A和B的最长公共子序列,一个从前往后,另一个从后往前,然后遍历枚举就可以了,O(n^2)..

 //STATUS:C++_AC_343MS_8164KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,102400000")
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
typedef __int64 LL;
typedef unsigned __int64 ULL;
//const
const int N=;
const int INF=0x3f3f3f3f;
const LL MOD=,STA=;
const LL LNF=1LL<<;
const double EPS=1e-;
const double OO=1e50;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End char A[N],B[N],C[N];
int da[N][],db[N][],f1[N][N],f2[N][N];
int T; void getd(char a[],char c[],int d[][],int &cnt)
{
cnt=;
int i,j,k,len=strlen(a),lenc=strlen(c);
for(i=;i<len;i++){
if(a[i]!=c[])continue;
for(j=i,k=;j<len;j++){
if(a[j]==c[k]){
k++;
if(k==lenc)break;
}
}
if(k==lenc){
d[cnt][]=i;
d[cnt++][]=j;
}
}
} int main(){
// freopen("in.txt","r",stdin);
int i,j,lena,lenb,lenc,ca=;
int cnta,cntb,ans;
scanf("%d",&T);
while(T--)
{
scanf("%s%s%s",A,B,C);
lena=strlen(A);lenb=strlen(B);lenc=strlen(C);
getd(A,C,da,cnta);
getd(B,C,db,cntb); for(i=;i<=lena || i<=lenb;i++)
f1[i][]=f1[][i]=f2[i][lenb]=f2[lena][i]=;
for(i=;i<=lena;i++){
for(j=;j<=lenb;j++){
f1[i][j]=Max(f1[i][j-],f1[i-][j]);
if(A[i-]==B[j-])f1[i][j]=Max(f1[i][j],f1[i-][j-]+);
}
}
for(i=lena-;i>=;i--){
for(j=lenb-;j>=;j--){
f2[i][j]=Max(f2[i+][j],f2[i][j+]);
if(A[i]==B[j])f2[i][j]=Max(f2[i][j],f2[i+][j+]+);
}
}
ans=;
for(i=;i<cnta;i++){
for(j=;j<cntb;j++){
ans=Max(ans,f1[da[i][]][db[j][]]+f2[da[i][]+][db[j][]+]);
}
}
if(!cnta || !cntb)ans=-lenc; printf("Case #%d: %d\n",ca++,ans+lenc);
}
return ;
}

HDU-4681 String 枚举+DP的更多相关文章

  1. HDU 4681 string 求最长公共子序列的简单DP+暴力枚举

    先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...

  2. HDU 4681 String(2013多校8 1006题 DP)

    String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...

  3. HDU 4681 String(DP)

    题目链接 枚举A和B中每一段含有C的段,A的前面 后面和B前面后面,求最长公共子序.观察发现,可以预处理最长公共子序. #include <iostream> #include <c ...

  4. HDU 4681 STRING dp+暴力。

    题意:不说了很好懂. 这题这么水= =...当时竟然没有勇气暴力搜一下.昨天(好吧前天.)比赛的时候胃疼,看到这题想了一个办法就是对每一个出现最短的C串前后连接然后对这个串求最长公共子序列.其实优化一 ...

  5. HDU 4681 String 最长公共子序列

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意: 给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串.求d最大 ...

  6. HUST 4681 String (DP LCS变形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题目大意:给定三个字符串A,B,C 求最长的串D,要求(1)D是A的字序列 (2)D是B的子序列 ...

  7. hdu 4681 string

    字符串DP 题意:给你三个字符串a,b,c求字符串d的长度. 字符串d满足的要求:是a和b的公共子序列,c是它的子串. 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包 ...

  8. hdu 4681 String(转载)

    #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream& ...

  9. HDU 4681 String 胡搞

    设串C的第一个字母在串A中出现的位置是stA, 串C的最后一个字母在串A中出现的位置是edA. 设串C的第一个字母在串B中出现的位置是stB, 串C的最后一个字母在串B中出现的位置是edB. 求出每一 ...

随机推荐

  1. spoj 394

    每段可以连续的串的可能性是个Fibonacci数列   但是直接dp更好吧~~ #include <cstdio> #include <cstring> using names ...

  2. grep正则表达式后面的单引号和双引号的区别

    单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换:双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容! 一般常量用单引号' ...

  3. 进阶:使用 EntityManager

    JPA中要对数据库进行操作前,必须先取得EntityManager实例,这有点类似JDBC在对数据库操作之前,必须先取得Connection实例,EntityManager是JPA操作的基础,它不是设 ...

  4. POJ3297+map字符串处理

    简单的字符串处理题. 要注意细节! 附数据两组: ABCC abc ae AAA abc AAAA abc A a B a C a /* */ #include<stdio.h> #inc ...

  5. intelliJ idea读取资源文件

    原文:intelliJ idea读取资源文件 原文地址 http://yanwushu.sinaapp.com/intellij-idea_raed_resource_file/ 官方文档 以下是je ...

  6. HTTP代理协议 HTTP/1.1的CONNECT方法

    我们平时使用HTTP协议无非就是GET.POST这些方法,但是HTTP的内容远不止那些.今天就来说说HTTP代理使用的CONNECT.这个不是在网页开发上用的,如果没兴趣就跳过吧. APACHE只是作 ...

  7. 爬虫实现(hpricot)

    1.基本代码 在gemfile中加入gem "hpricot",bundler install之后,在application.rb中require "hpricot&qu ...

  8. linux根目录下的文件夹

    http://wenku.baidu.com/link?url=PDpw0nuLm71kihyYWdGY2niJhQEsJXfu8NVbjy9RxLa-Zur3aoG4NkCFpD-GQKM_sQWN ...

  9. Hadoop伪分布模式配置部署

    .实验环境说明 注意:本实验需要按照上一节单机模式部署后继续进行操作 1. 环境登录 无需密码自动登录,系统用户名 shiyanlou,密码 shiyanlou 2. 环境介绍 本实验环境采用带桌面的 ...

  10. [LOJ 1027] Dangerous Maze

    A - A Dangerous Maze Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...