HDU 4681 String 胡搞
设串C的第一个字母在串A中出现的位置是stA, 串C的最后一个字母在串A中出现的位置是edA。
设串C的第一个字母在串B中出现的位置是stB, 串C的最后一个字母在串B中出现的位置是edB。
求出每一对合法的(stA, edA),(stB, edB)
对每一组( stA[i], edA[i] ) 和 ( stB[j], ed[j] ), 求串A[0,stA[i]-1]和串B[0, stB[j]-1]的最长公共子序列长度L1, 求串A[edA[i]+1, lenA-1]和串B[stB[j]+1, lenB-1]的最长公共子序列长度L2, 答案为max( lenC+L1+L2 )……
现在看看自己赛场上写的代码觉得自己好脑残啊……虽然不紧张但是当时在TLE了N次之后已经觉得脑子是一团浆糊了,我从机子上下静下心仔细想想的时候才发现我根本没理解透薛薛的意思。下次觉得自己不好了的时候一定要果断换人,不然太耽误时间了orz……
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 1010 using namespace std; int N;
int c1[maxn][maxn];
int c2[maxn][maxn];
int duiA[maxn][];
int duiB[maxn][];
int cntA, cntB;
char strA[maxn], strB[maxn], strC[maxn];
char ReA[maxn], ReB[maxn];
int lenA, lenB, lenC; void Calc(char* a, char* b, int c[maxn][maxn])
{
int i,j;
int la=strlen(a);
int lb=strlen(b);
for(i=; i<la; i++)
c[i][]=;
for(j=; j<lb; j++)
c[][j]=;
for(i=; i<=la; i++)
{
for(j=; j<=lb; j++)
{
if(a[i-]==b[j-])
c[i][j]=c[i-][j-]+;
else
{
if(c[i][j-]>c[i-][j])
c[i][j]=c[i][j-];
else
c[i][j]=c[i-][j];
}
}
}
return;
} int solved()
{
int tmpans = ; for ( int i = ; i < cntA; ++i )
for ( int j = ; j < cntB; ++j )
{
int preA = duiA[i][] - , preB = duiB[j][] - ;
int sufA = lenA - duiA[i][];
int sufB = lenB - duiB[j][];
//printf("c1[%d][%d]=%d c2[%d][%d]=%d\n", preA, preB, c1[preA][preB], duiA[i][1], duiB[j][i], c2[sufA][sufB] );
int tmp = ;
if ( preA > && preB > ) tmp += c1[preA][preB];
if ( sufA > && sufB > ) tmp += c2[sufA][sufB];
tmpans = max( tmpans, tmp );
} return tmpans;
} void preSolved()
{
cntA = ;
cntB = ; for ( int i = ; i + lenC < lenA; ++i )
{
if ( strA[i] != strC[] ) continue;
int cur = i + , j;
for ( j = ; j < lenC && cur < lenA; )
{
if ( strA[cur] == strC[j] ) ++j;
++cur;
}
if ( j == lenC )
{
duiA[cntA][] = i + ;
duiA[cntA][] = cur;
++cntA;
}
} for ( int i = ; i + lenC < lenB; ++i )
{
if ( strB[i] != strC[] ) continue;
int cur = i + , j;
for ( j = ; j < lenC && cur < lenB; )
{
if ( strB[cur] == strC[j] ) ++j;
++cur;
}
if ( j == lenC )
{
duiB[cntB][] = i + ;
duiB[cntB][] = cur;
++cntB;
}
} return;
} int main()
{
//freopen("s.txt", "w", stdout );
int T, cas = ;
scanf( "%d", &T );
while ( T-- )
{
scanf( "%s", strA );
scanf( "%s", strB );
scanf( "%s", strC );
lenA = strlen( strA );
lenB = strlen( strB );
lenC = strlen( strC );
if ( lenC == lenA || lenC == lenB )
{
printf( "Case #%d: %d\n", ++cas, lenC );
continue;
}
Calc( strA, strB, c1 );
for ( int i = lenA - ; i >= ; --i ) ReA[lenA--i] = strA[i];
for ( int i = lenB - ; i >= ; --i ) ReB[lenB--i] = strB[i];
ReA[lenA] = '\0', ReB[lenB] = '\0';
Calc( ReA, ReB, c2 ); preSolved();
int ans = solved() + lenC;
printf( "Case #%d: %d\n", ++cas, ans );
}
return ;
}
HDU 4681 String 胡搞的更多相关文章
- HDU 4681 String 最长公共子序列
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意: 给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串.求d最大 ...
- hdu 4681 string
字符串DP 题意:给你三个字符串a,b,c求字符串d的长度. 字符串d满足的要求:是a和b的公共子序列,c是它的子串. 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包 ...
- HDU 4681 String(2013多校8 1006题 DP)
String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Subm ...
- HDU 4681 STRING dp+暴力。
题意:不说了很好懂. 这题这么水= =...当时竟然没有勇气暴力搜一下.昨天(好吧前天.)比赛的时候胃疼,看到这题想了一个办法就是对每一个出现最短的C串前后连接然后对这个串求最长公共子序列.其实优化一 ...
- hdu 4681 String(转载)
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream& ...
- HDU 4681 String(DP)
题目链接 枚举A和B中每一段含有C的段,A的前面 后面和B前面后面,求最长公共子序.观察发现,可以预处理最长公共子序. #include <iostream> #include <c ...
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...
- HDU 4690 EBCDIC (2013多校 1005题 胡搞题)
EBCDIC Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total Su ...
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
随机推荐
- Ubuntu ndk环境变量配置
https://blog.csdn.net/gulingfengze/article/details/70149092 用source /etc/profile,有些博客写的使用sudo gedit ...
- SSI框架下,用jxl实现导出功能
SSI框架下,用jxl实现导出功能 先说明一下,这个是SSI框架下,前端用ExtJs,应用在一个企业级的系统中的导出功能,因为是摸索着做的,所以里面有一些代码想整理一下,如果有人看到了,请视自己的架构 ...
- Java分享笔记:File类中常用方法的介绍
java.io包下的File类用于描述和创建一个文件或文件夹对象,只能对文件或文件夹做一些简单操作,不能修改文件的内容,功能比较有限.下面是对于File类中常用方法的程序演示. [1] 演示程序一 p ...
- HTML5一些标签和属性
<bdo> 元素 可以覆盖默认文本的方向 根据dir 属性来控制文字的排序方向 属性:dir="rtl" ...
- nginx配置安装
先安装pcrepcre作用是让Nginx支持Rewrite功能下载地址:https://sourceforge.net/projects/pcre/files/pcre/,选择最新版本进行下载下载之后 ...
- JavaScript对象回收机制
js维护了一张对象引用表: 当一个对象被创建以后,栈内就有一个a,a这个对象就指向了对这个地址,当a=new Person()执行后,引用次数加1.当a=null置空,引用次数减1.由系统来维护对象引 ...
- 根据html页面模板动态生成html页面(c#类)
本文转载自:http://www.cnblogs.com/yuanbao/archive/2008/01/06/1027985.html点击打开链接 一直以为动态生成静态页面不好做,昨天在网上找了下, ...
- CentOS7下安装FTP
1.安装vsftpd yum install -y vsftpd 2.设置 使用命令systemctl status vsftpd.service查看ftp状态. 开启ftp systemctl st ...
- 【TP5.1】HTML标签自动转义,导致CKEditor保存内容无法正常显示!
问题:使用Thinkphp5.1 开发的时候显示CKEditor保存的内容不符合预期. 希望的样子,肯定是不显示<p><b>等标签,而是下面的样子. 因为刚开始使用TP5.1和 ...
- python 函数的嵌套 和 作用域链
# def max(a,b): # return a if a>b else b # # def the_max(x,y,z): #函数的嵌套调用 # c = max(x,y) # return ...