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

本题要考虑字符串本身就存在tandem,

如测试用例

aaaaaaaaabbb

3

输出结果应该是8而不是6,因为字符串本身的tanderm时最长的

故要考虑字符串本身的最大的tanderm和添加k个字符后最大的tanderm

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <set>

using namespace std;

int maxTandem(string& str){
    for(int inteval = str.length()/2; inteval>=0; --inteval){
        for(int i = 0 ; i <=str.length()-2*inteval; ++i){
            bool flag = false;
            for(int j = i,k=i+inteval; j < i+inteval; j++,k++){
                if(str[j] != str[k]){
                    flag = true;
                    break;
                }
            }
            if(!flag) return inteval;
        }
    }
    return 0;
}

int main(){
    string str;
    int k;
    cin  >> str >> k;
    int len = str.length();
    if(k>=len){
        cout<<((k+len)%2 ? k+len-1:k+len)<<endl;
    }else{
        int newlen = len+k, startIndex=newlen-newlen/2*2, p =newlen/2;
        for( p = newlen/2; p> k;  -- p){
            int startIndex=newlen-p*2;
            bool flag = false;
            for(int i = startIndex, j = startIndex+p;  i < min(len,startIndex+p) && j < len; ++ i, ++ j){
                if(str[i] != str[j]){
                    flag = true;
                    break;
                }
            }
            if(!flag) break;
        }
        cout<<2*max(p,maxTandem(str))<<endl;
    }
}

本题将上面两个部分合并,即在字符串s后面添加k个‘?’,再对整个字符串搜索

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main(){
    string s;
    int k;
    cin >> s >> k;
    int slen = s.length();
    s+=string(k,‘?‘);
    int len = s.length()/2, interval = len;
    for(interval = len; interval >=0; interval--){
        bool flag = false;
        for(int p = 0; p<= s.length()-2*interval; ++ p){
            flag = false;
            for(int i = p, j = p+interval; i < min(slen,p+interval) && j < slen; ++ i, ++ j){
                if(s[j]!= ‘?‘ && s[i]!=s[j] ){ flag = true;break;}
            }
            if(!flag) break;
        }
        if(!flag) break;
    }
    cout<<2*interval<<endl;
}

Codeforces Round #253 (Div. 2) B - Kolya and Tandem Repeat,布布扣,bubuko.com

时间: 2024-10-10 16:15:01

Codeforces Round #253 (Div. 2) B - Kolya and Tandem Repeat的相关文章

Codeforces Round 253 (Div. 2)

layout: post title: Codeforces Round 253 (Div. 2) author: "luowentaoaa" catalog: true tags: mathjax: true - codeforces - 模拟栈 - 贪心 传送门 A.Anton and Letters (签到) 题意 判断字符串里面有多少个不同字符 思路 直接set一下 #include<bits/stdc++.h> using namespace std; typed

Codeforces Round #253 (Div. 2)——Borya and Hanabi

题目连接 题意: n表示有n个卡片,每个卡片有一种颜色和一个数字(共五种不同的颜色和五个不同的数字).事先知道每种卡片有几张,但是不知道具体的位置.问需要几次提示就可以知道所有卡片的位置都在哪里:每次提示可以选择一个颜色或者一个数字,就可以知道含有所选属性的牌有哪些. 分析: 首先明白总情况数不多,只有2^10,所以枚举. 能确定某张牌位置的情况:1)提示了一个属性,而这个属性只有一张牌 2)某个属性有n张牌,知道了n-1张牌的位置 两个提示确定一张牌:必然的,只要存在这张牌,那么两个提示必然可

Codeforces Round #253 (Div. 2), problem: (B)【字符串匹配】

简易字符串匹配,题意不难 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 int main(){ 9 int i, j, k, t, n; 10 int num, flag, ans; 11 char a[300]; 12 sc

Codeforces Round #253 (Div. 1) (A, B, C)

Codeforces Round #253 (Div. 1) 题目链接 A:给定一些牌,然后现在要提示一些牌的信息,要求提示最少,使得所有牌可以被分辨出来. 思路:一共2^10种情况,直接暴力枚举,然后对于每种情况去判断,判断的时候只要两两张牌枚举出来判断即可.不得不说CF机子真心强大,2秒限制还是能跑10^8 B:给定n个发生概率,求选出其中一些事件,使得正好有一件发生的概率最大. 思路:贪心,从大到小排序概率,然后一个个概率进来判断有没有更大,有就加入该事件,没有就跳过 C:给定n个数字,要

Codeforces Round #253 (Div. 1)-A,B

A题: 由题意可知,最多翻10次就可以(其实8次就够了),那么我们就用状态压缩表示状态. 对于某种状态,如果某一位为0,那么代表这一位不翻,否则代表这一位翻. 对于某一种翻的状态: 如果牌中有G3,那么就把G和3进行连边.其他的连边类似,不要重边. 对于任意一条边的两个端点,分三种情况讨论: 1,两个端点都翻了,那么很明显,这张牌被表示出来了. 2,两个端点中只有一个端点被翻,那么这个对应的num加1. 3,两个端点都没有被翻,计数器tt加1. 对于任意一种状态: 1,如果计数器tt大于1,那么

Codeforces Round #253 (Div. 2) A. Anton and Letters

题目很简单,只需要注意带空格的输入用getline即可 #include <iostream> #include <vector> #include <algorithm> #include <string> #include <set> using namespace std; int main(){ string str; getline(cin,str); set<char> a; for(int i= 1 ; i < s

Codeforces Round #253 (Div. 2)B(暴力枚举)

就暴力枚举所有起点和终点就行了. 我做这题时想的太多了,最简单的暴力枚举起始点却没想到...应该先想最简单的方法,层层深入. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i