设串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. 公众帐号如何向用户发送emoji表情(php版,附emoji编码表)

    //字节转Emoji表情 function bytes_to_emoji($cp) { if ($cp > 0x10000){ # 4 bytes return chr(0xF0 | (($cp ...

  2. React后端管理系统-商品详情detail组件

    import React from 'react'; import MUtil from 'util/mm.jsx' import Product from 'service/product-serv ...

  3. CSS 滤镜技巧与细节

    本文主要介绍 CSS 滤镜的不常用用法,希望能给读者带来一些干货! 注意:ie不兼容 本文所描述的滤镜,指的是 CSS3 出来后的滤镜,不是 IE 系列时代的滤镜,话不多说,直接开车,语法如下: { ...

  4. 第34-3题:LeetCode437. Path Sum III

    题目 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数. 示例: root = [10,5,-3,3,2,null,11,3,-2,null,1], sum ...

  5. 【赛时总结】 ◇赛时·III◇ AtCoder ABC-099

    ◆赛时·III◆ ABC-099 ■唠叨■ 不要问我为什么先给ABC-100写了博客再写的ABC-099-- 莫名觉得这次比赛特别简单--虽然我并没有参加比赛,只是之后再补做的.QwQ ■试题& ...

  6. 远程桌面连接失败,提示CredSSP加密Oracel修正问题解决

    今天远程桌面的时候失败了,出现以下提示 于是上网找解决办法,经过测试,该方法是可行的. 首先,在控制台中输入regedit,打开注册表

  7. 记一次samba排错 Failed to start Samba SMB Daemon.

       记录一次服务出错排错的过程,很多新手出了点错不百度直接巴拉巴拉的问,一般老手根据经验可以给出一点建议,但是由于个体环境的差异并不适用,反而埋怨起来.这种真的无F**K可说,所以要培养自己的排错能 ...

  8. PHP siege 压测 QPS大小

    1.使用 PHP-FPM SOCKET的形式通讯 2.配置 PHP-FPM配置 [root@bogon php-fpm.d]# ls -al 总用量 drwxr-xr-x. root root 8月 ...

  9. 模块pandas

    python之pandas简单介绍及使用(一) https://www.cnblogs.com/misswangxing/p/7903595.html

  10. strak组件(9):关键字搜索

    效果图: 在列表视图函数增加搜索功能. 新增函数 def get_search_list(self) 钩子方法,获取搜索条件 一.strak组件 strak/service/core_func.py ...