设串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. JS获取页面传过来的值

    利用JS获取页面的传值,此方法只适应Get传值. 获取页面之间的传值,在后台我们很容易获取,那我们在前台只利用JS怎么写呢? 在看代码之前你需要了解的 ① 参考:W3C Location 对象 Loc ...

  2. VisualSVN 4.0.10 破解版 附上破解过程

    VisualSVN一般情况下使用不需要破解,可以直接使用社区授权.但是社区授权不支持域用户. 如果要再域下面使用就需要破解了. 原版的VisualSVN和破解后的DLL已打包上传(仅供学习使用) 破解 ...

  3. 前端JavaScript之ECMA

    1.JavaScript基础 2.语法规则 3 常用内置对象 4 函数 5 伪数组 6.异常处理 1.1 web前端分为三层 HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化 ...

  4. 使用android ndk编译x86 so在linux下使用的问题

    一直以为android ndk编译x86 so库可以在linxu下运行,结果我试了几次都行不通.后来想了一下,android ndk编译的库应该只能在android设备或模拟器上运行才有效,后来改用 ...

  5. 概述「DAG加边至强连通」模型&&luoguP2746校园网Network of Schools

    模型概述 有一DAG,问最少加多少条边能够使图强连通. 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的 ...

  6. C++ Primer 学习笔记_Chapter4 数组和指针–指针

    一.什么是指针? 指针与迭代器一样,指针提供对其所指对象的间接访问,指针保存的是另一个对象的地址: string s("hello"); string *ps = &s; ...

  7. 在Ubuntu下安装gcc编译器+测试

    1.输入命令: sudo apt-get install gcc libc6-dev 2.创建文件hello.c使用命令: touch hello.c 3.在hello.c中写入:  #include ...

  8. 将Komodo Edit打造成Python开发的IDE

    Komodo Edit 支持Python 界面清爽, 将Komodo Edit 设置成Python的IDE,具体操作方法如下: 先添加自定义命令. 再设置命令行参数 设置高级选项 设置快捷键 完成.

  9. C语言基础篇(三) 指针

    导航: 1.指针     2. 数组     3. 结构体,共用体     4. 内存分布图     5. 段错误分析 ----->x<------------->x<---- ...

  10. [CodeForces948C]Producing Snow(优先队列)

    Description 题目链接 Solution 将温度做一个前缀和,用一个优先队列依次处理一遍 思路还是很简单的 Code #include <cstdio> #include < ...