设串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 胡搞的更多相关文章

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

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

  2. hdu 4681 string

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

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

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

  4. HDU 4681 STRING dp+暴力。

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

  5. hdu 4681 String(转载)

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

  6. HDU 4681 String(DP)

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

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

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

  8. HDU 4690 EBCDIC (2013多校 1005题 胡搞题)

    EBCDIC Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total Su ...

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

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

随机推荐

  1. MAC卸载/删除 Parallels Desktop虚拟机的方法

    一些MAC用户在自己的电脑上安装了虚拟机之后,想要将它卸载,但是不知道该怎么做.今天小编就为大家带来了这个问题的解决方法. 解决方案(删除/卸载虚拟机 (VM): 1.启动Parallels Desk ...

  2. using System.Security.Cryptography

    这个命名空间主要是用来进行加密的一些类. 加密服务: 公共网络(如 Internet)不提供实体之间安全通信的方式. 此类网络上的通信易被读取或甚至被未经授权的第三方修改. 加密有助于防止数据被查看, ...

  3. ios xmppFramework框架的导入步骤和介绍

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 第一种方法直接拖 1> 拖入文件夹 ...

  4. 优化tableView性能(针对滑动时出现卡的现象)

    优化tableView性能(针对滑动时出现卡的现象) 在iOS应用中,UITableView应该是使用率最高的视图之一了.iPod.时钟.日历.备忘录.Mail.天气.照片.电话.短信. Safari ...

  5. 【PE】手动给PE文件添加一段代码MessageBoxA

    源程序是这个样子: 思路: 1.通过LordPE工具拿到所需数据 2.OllyDebug通过BP MessageBoxA拿到MessageBoxA地址 3.UE十六进制编辑器定位代码节基址 4.在代码 ...

  6. python json.dumps raise TypeError(repr(o) + " is not JSON serializable") TypeError: 0 is not JSON serializable

    出错如题. 这个问题有可能是因为python的json.dumps没法识别dump内容里的某些数据类型导致的.我的问题是因为dict中含有numpy.int64,numpy.float等类型导致的,需 ...

  7. nginx配置安装

    先安装pcrepcre作用是让Nginx支持Rewrite功能下载地址:https://sourceforge.net/projects/pcre/files/pcre/,选择最新版本进行下载下载之后 ...

  8. mysql的一些相关的命令(2013-05-05-bd 写的日志迁移

    cmd中连接:mysql -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) --建立数据库creata database 数据库名;--切换到数据库下工 ...

  9. POJ:3421-X-factor Chains(因式分解)(全排列)

    X-factor Chains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7986 Accepted: 2546 Descr ...

  10. python-11多线程

    1-多任务可以由多进程完成,也可以由一个进程内的多线程完成. 1.1多线程代码示例 import time, threading def loop(): print("thread %s i ...