String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 695    Accepted Submission(s): 254


Problem Description
Given 3 strings A, B, C, find the longest string D which satisfy the following rules:

a) D is the subsequence of A

b) D is the subsequence of B

c) C is the substring of D

Substring here means a consecutive subsequnce.

You need to output the length of D.
 
Input
The first line of the input contains an integer T(T = 20) which means the number of test cases.

For each test case, the first line only contains string A, the second line only contains string B, and the third only contains string C.

The length of each string will not exceed 1000, and string C should always be the subsequence of string A and string B.

All the letters in each string are in lowercase.

 
Output
For each test case, output Case #a: b. Here a means the number of case, and b means the length of D.
 
Sample Input
2
aaaaa
aaaa
aa
abcdef
acebdf
cf
 
Sample Output
Case #1: 4
Case #2: 3

Hint

For test one, D is "aaaa", and for test two, D is "acf".

 
Source
 
>Recommend
zhuyuanchen520
   
  
    祭奠一下这个题
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#define N 1100
using namespace std;
string s1,s2,s3,s4,s5;
char temp[N];
int num1[N][N],num2[N][N];
struct num
{
int sta,end;
} a[N],b[N];
int main()
{
//freopen("data.in","r",stdin);
void get(int (*p)[N],string ch1,string ch2);
int t,tem=1;
scanf("%d",&t);
while(t--)
{
cin>>s1>>s2>>s3;
get(num1,s1,s2);
int l1 = s1.size();
for(int i=0; i<=l1-1; i++)
{
temp[l1-1-i] = s1[i];
}
temp[l1] = '\0';
s4 = temp;
int l2 = s2.size();
for(int i=0; i<=l2-1; i++)
{
temp[l2-1-i] = s2[i];
}
temp[l2] = '\0';
s5 = temp;
get(num2,s4,s5);
int l3 = s3.size(),Top1=0,Top2=0;
for(int i=0; i<=l1-1; i++)
{
if(s1[i]==s3[0])
{
int x = 0;
int sta = i;
int end = -1;
for(int j=i; j<=l1-1&&x<=l3-1; j++)
{
if(s1[j]==s3[x])
{
x++;
}
if(x==l3)
{
end = j;
}
}
if(end==-1)
{
continue;
}
a[Top1].sta = sta;
a[Top1++].end = end;
}
}
for(int i=0; i<=l2-1; i++)
{
if(s2[i]==s3[0])
{
int x = 0;
int sta = i;
int end = -1;
for(int j=i; j<=l2-1&&x<=l3-1; j++)
{
if(s2[j]==s3[x])
{
x++;
}
if(x==l3)
{
end = j;
}
}
if(end==-1)
{
continue;
}
b[Top2].sta = sta;
b[Top2++].end = end;
}
}
int res = l3,Max=0;
for(int i=0; i<=Top1-1; i++)
{
for(int j=0; j<=Top2-1; j++)
{
int x1 = a[i].sta;
int y1 = a[i].end;
int x2 = b[j].sta;
int y2 = b[j].end;
int k1 = 0;
if(x1>0&&x2>0)
{
k1 = num1[x1-1][x2-1];
}
int k2 = 0;
if(y1<l1-1&&y2<l2-1)
{
k2 = num2[l1-2-y1][l2-2-y2];
}
Max = max(Max,res+k2+k1);
}
}
printf("Case #%d: %d\n",tem++,Max);
}
return 0;
}
void get(int (*p)[N],string ch1,string ch2)
{
int l1 = ch1.size();
int l2 = ch2.size();
memset(p,0,sizeof(p));
for(int i=0; i<=l1-1; i++)
{
for(int j=0; j<=l2-1; j++)
{
if(i==0&&j==0)
{
if(ch1[i]==ch2[j])
{
p[i][j] = 1;
}
}
else if(i==0&&j!=0)
{
if(ch1[i]==ch2[j])
{
p[i][j] = 1;
}
else
{
p[i][j] = p[i][j-1];
}
}
else if(i!=0&&j==0)
{
if(ch1[i]==ch2[j])
{
p[i][j] = 1;
}
else
{
p[i][j] = p[i-1][j];
}
}
else
{
if(ch1[i]==ch2[j])
{
p[i][j] = p[i-1][j-1]+1;
}
else
{
p[i][j] = max(p[i][j-1],p[i-1][j]);
}
}
}
}
}

HDU 4679 String的更多相关文章

  1. HDU 3374 String Problem (KMP+最大最小表示)

    HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  2. Terrorist’s destroy HDU - 4679

    Terrorist’s destroy HDU - 4679 There is a city which is built like a tree.A terrorist wants to destr ...

  3. HDU 3374 String Problem(KMP+最大/最小表示)

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. hdu 4679 Terrorist’s destroy 树形DP

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给定一颗树,每条边有一个权值w,问切掉哪条边之后,分成的两颗树的较大的直径*切掉边的权值最小? ...

  5. hdu 5772 String problem 最大权闭合子图

    String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...

  6. HDU 4821 String(2013长春现场赛I题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 字符串题. 现场使用字符串HASH乱搞的. 枚举开头! #include <stdio.h ...

  7. HDU 2476 String painter(区间DP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...

  8. 2017多校第6场 HDU 6096 String AC自动机

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6096 题意:给了一些模式串,然后再给出一些文本串的不想交的前后缀,问文本串在模式串的出现次数. 解法: ...

  9. HDU 6194 string string string(后缀数组+RMQ)

    string string string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

随机推荐

  1. Qt实现16进制unicode转utf-8以及国际音标编码问题

    由于项目需要,需要对网络资源进行解码.遇到编码问题.研究了下基本编码原理.于是有了下面两个通用代码 1. 16进制unicode转换为utf-8中文显示 QString unicodeToUtf_8( ...

  2. 卡特兰数(Catalan)简介

    Catalan序列是一个整数序列,其通项公式是 h(n)=C(2n,n)/(n+1) (n=0,1,2,...) 其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, ...

  3. JAVA GUI学习 - JSplitPane分屏组件学习

    public class JSplitPaneKnow extends JFrame { JSplitPane jSplitPane; JPanel jPanelRed; JPanel jPanelB ...

  4. hdoj 5311 Hidden String(KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5311 思路分析:该问题要求在字符串中是否存在三个不相交的子串s[l1..r1], s[l2..r2], ...

  5. HDU 1104 Remainder( BFS(广度优先搜索))

    Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. HDU 1501 Zipper 动态规划经典

    Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. STL之使用vector排序

    应用场景: 在内存中维持一个有序的vector: // VectorSort.cpp : Defines the entry point for the console application. #i ...

  8. JavaScript constructor prototyoe

    想加深一下自己对construtcor prototype的印象所以写了这一篇文章 对象的constructor 就是Object 除了通过构造函数创建的对象意外 他的constructor 都是 都 ...

  9. 【Linux命令】数据库mysql配置命令

    # 检查MySQL服务器系统进程 ~ ps -aux|grep mysql mysql 1103 0.0 0.3 492648 51780 ? Ssl 14:04 0:21 /usr/sbin/mys ...

  10. 迪杰斯特拉算法c语言实现

    /*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法  P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2  ...