题目链接:http://codeforces.com/contest/443/problem/B

题目意思:给出一个只有小写字母的字符串s(假设长度为len),在其后可以添加 k 个长度的字符,形成一个长度为len+k的新串 s'。问在 s' 中,可以形成的最长tandem repeat 是 多长。tandem repeat 的定义是:si = si+n (1 <= i <= n; 2*n <= k+len)

注意,这个tandem repeat 是相邻的!!也就是对于abcwerabc?? (??,表示可以添加的长度为k = 2),如果?? 填入we,并不代表之前的abcwe(a下标:0)== abcwe(a下标:6),因为中间多了个r  !答案其实是4。只能将?? 变为 bc,这样的tandem repeat 的长度为2*2 = 4(两个bc相等)

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = + ;
char str[maxn]; int main()
{
int k;
while (scanf("%s%d", str, &k) != EOF)
{
int len = strlen(str);
if (len <= k)
printf("%d\n", (len+k)& ? len+k-: len+k);
else
{
int ans = ;
for (int i = ; i < len; i++) // 枚举原串s的每个位置
{
for (int j = i+; *j-i <= len+k; j++) // 2*j-i <= len+k:控制住si+n不大于新串s'的长度
{
bool ok = true;
for (int l = ; l < j-i && l+j < len; l++) // 枚举间隙,j-i代表间隙,也就是题目中si = si+n中的n
{
if (str[i+l] != str[j+l])
{
ok = false;
break;
}
}
if (!ok)
continue;
ans = max(ans, *(j-i));
}
}
printf("%d\n", ans);
}
}
return ;
}

  补充一点,对于l+j < len 这个条件是必不可少的!因为它保证比较的是原序列 s 的字符有 tandem repeat,这些字符是确定的。而对于后面添加的 k 个字符是不确定的,所以就不能单纯用str[i+l] = str[j+l] 来比较了。但由于有 2*j - i <= len+k,所以j 的值还是可以取的(一直ok = true),它默认 k 个字符中任意填字符,可以使得s' 有 tandem repeat,2*(j-i)就是求出repeat的长度了。

codeforces 443 B. Kolya and Tandem Repeat 解题报告的更多相关文章

  1. Codeforces 443 B. Kolya and Tandem Repeat

    纯粹练JAVA.... B. Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megab ...

  2. Codeforces 443 B Kolya and Tandem Repeat【暴力】

    题意:给出一个字符串,给出k,可以向该字符串尾部添加k个字符串,求最长的连续重复两次的子串 没有想出来= =不知道最后添加的那k个字符应该怎么处理 后来看了题解,可以先把这k个字符填成'*',再暴力枚 ...

  3. cf443B Kolya and Tandem Repeat

    B. Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  4. Kolya and Tandem Repeat

     Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  5. CF B. Kolya and Tandem Repeat

    Kolya got string s for his birthday, the string consists of small English letters. He immediately ad ...

  6. Codeforces Round #253 (Div. 2) B - Kolya and Tandem Repeat

    本题要考虑字符串本身就存在tandem, 如测试用例 aaaaaaaaabbb 3 输出结果应该是8而不是6,因为字符串本身的tanderm时最长的 故要考虑字符串本身的最大的tanderm和添加k个 ...

  7. CodeForces 443B Kolya and Tandem Repeat

    题目:Click here 题意:给定一个字符串(只包含小写字母,并且最长200)和一个n(表示可以在给定字符串后面任意加n(<=200)个字符).问最长的一条子串长度,子串满足前半等于后半. ...

  8. codeforces 814B.An express train to reveries 解题报告

    题目链接:http://codeforces.com/problemset/problem/814/B 题目意思:分别给定一个长度为 n 的不相同序列 a 和 b.这两个序列至少有 i 个位置(1 ≤ ...

  9. codeforces 558B. Amr and The Large Array 解题报告

    题目链接:http://codeforces.com/problemset/problem/558/B 题目意思:给出一个序列,然后找出出现次数最多,但区间占用长度最短的区间左右值. 由于是边读入边比 ...

随机推荐

  1. mysql报错Packet for query is too large (12238 > 1024). You can change this value

    今天将项目部署到linux服务器的时候莫名其妙的报一些错误,可是在本地啥错没有,通过实时查看tomcat 的日志之后发现报错是: 实时查看日志: .先切换到:cd usr/local/tomcat5/ ...

  2. Java面试题集(六)

    以下为框架补充部分: Struts 2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的? Action从页面获取数据有三种方式: ①通过Action属性接 ...

  3. 记一次ORM的权衡和取舍

    面对ORM的选型,有些人是根据自己熟悉程度来评判,有些人是根据他人的推荐来抉择,有些人觉得都差不多,随便了.当自己要真正做选择的时候,以上的这些依据都无法真正说服自己,因为不同的业务需求,不同的团队构 ...

  4. 深入探究Java中hashCode()和equals()的关系

    目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...

  5. T1046 旅行家的预算 codevs

    http://codevs.cn/problem/1046/ 题目描述 Description 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D ...

  6. 利用javascript实现在圆周上匀速划动的动画效果

    先看下效果:          

  7. Ubuntu 16.04安装IntelliJ IDEA时快捷键冲突设置

    解决快捷键冲突可以有如下方法: 1.直接修改IDEA的,但是不建议这么干,因为多平台时,或者去到另外一台电脑时,统一的快捷键能更快的适应新的开发环境. 2.通过修改系统默认的快捷键. 3.就这两种方式 ...

  8. CAS 跨域原理

    http://www.blogjava.net/rain1102/articles/227739.html CAS(Central Authentication Service) 是 Yale 大学发 ...

  9. 常用Git命令手册

    常用Git命令手册 此文只是对Git有一定基础的人当记忆使用,比较简略,初级学员强烈推荐廖雪峰老师的Git系列教程,通俗易懂,戳此处即可开始学习 1.安装Git Linux sudo apt-get ...

  10. SolidEdge 如何绘制剖视图

    如果要创建剖视图,则点击切割平面按钮,然后绘制剖面线,画好之后点击完成   然后点击剖视图按钮,鼠标单击刚才的剖面线,往要的方向拖动,即可生成剖面视图   剖视图有时也需要用到旋转剖视图 如下图所示, ...