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. mysql读写分离

    严格意义上讲,MySQL 读.写分离确实存在上述情况,这是由Master-Slave 异步复制存在延迟所导致的,且Master binlog的写入为多线程,而Slave同步的sql_thread为单线 ...

  2. 宣布正式发布 Windows Azure 多重身份验证

    身份和访问管理是安全之锚,是企业 IT 部门的首要任务.它是随时随地向员工.合作伙伴和客户提供访问的关键所在.今天,我们非常高兴地宣布正式发布 Windows Azure 多重身份验证,从而为 IT ...

  3. cocos2d-x 源代码 :可以循环CCScrollView (,代码已被重构连接使用)

    cocos2d-x来源合计文件夹 http://blog.csdn.net/u011225840/article/details/31743129 1.准备工作 想弄懂可循环的CCscrollView ...

  4. 漏网之鱼--HTML&CSS

    一.HTML <meta>标签使用该标签描述网页的具体摘要信息,包括文档内容类型,字符编码信息,搜索关键字,网站提供的功能和服务的详细描述等.<meta>标签描述的内容并不显示 ...

  5. python网络编程——将IPv4地址转换成不同的格式

    1.将IPv4地址转换为32位二进制格式,用做底层网络函数. import socket from binascii import hexlify def convert_IPv4_address() ...

  6. C# DES对称加密解密

    /// <summary> /// 加密 /// </summary> /// <param name="str"></param> ...

  7. AHK(1)之运行程序或打开文档

    小鸟学AHK(1)之运行程序或打开文档   AHK就是AutoHotKey,是一款免费的.Windows平台下开放源代码的热键脚本语言. 亲爱的朋友,叫我怎么向你推荐它呢! COOL,对,就是酷,那么 ...

  8. Regex阅读笔记(二)之环视

    环视不匹配任何字符,只匹配文本中的特定位置. 正序环视:(?=) 逆序环视:(?<=) 非捕获(?:) 环视会检查子表达式能否匹配,但它只寻找能够匹配的位置,而不会真正占用这些字符. -用在字符 ...

  9. Spring MVC 入门基础

    欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 原文链接:http://java.chinaitlab.com/advance/899129.html 基本上是一个精简版的 ...

  10. 转: requirejs中文api (详细)

    RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代码,但其主要目的还是为了代码的模块化.它鼓励在使用脚本时以modul ...