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. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...

  2. Spring Boot普通类调用bean

    1 在Spring Boot可以扫描的包下 假设我们编写的工具类为SpringUtil. 如果我们编写的SpringUtil在Spring Boot可以扫描的包下或者使用@ComponentScan引 ...

  3. perl unicode utf-8 \x转换

    [root@dr-mysql01 ~]# cat x5.pl use Encode; use JSON; use URI::Escape; use LWP::Simple; my $host = &q ...

  4. JAVA面试中的几个重要基础问题

    1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...

  5. UITextField align left margin

    如果我们想让我们的UITextField输入的字体偏移几个像素,我们常常用空格来代替,有时候我们不想用空格的话怎么办? #import <UIKit/UIKit.h> @interface ...

  6. Web打印组件jatoolsPrinter(转载)

    应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布.但对程序员来说,因为浏览器的局限性,却要面对很多挑战.怎么样 ...

  7. 转换GridView的内容到Excel里面 ---带有格式

    http://www.aspsnippets.com/Articles/Export-GridView-to-Excel-in-ASPNet-with-Formatting-using-C-and-V ...

  8. URAL DP第一发

    列表: URAL 1225 Flags URAL 1009 K-based Numbers URAL 1119 Metro URAL 1146 Maximum Sum URAL 1203 Scient ...

  9. VC获取屏幕分辨率大小

    //以下两个函数获取的是显示屏幕的大小,不包括任务栏等区域 int screenwidth=GetSystemMetrics(SM_CXFULLSCREEN); int screenheight=Ge ...

  10. HTML5 总结-表单-表单元素

    HTML5 表单元素 HTML5 的新的表单元素: HTML5 拥有若干涉及表单的元素和属性. 本章介绍以下新的表单元素: datalist keygen output 浏览器支持 Input typ ...