Stay Hungry,Stay Foolish!

B. Kolya and Tandem Repeat -- codeforces

B. Kolya and Tandem Repeat

https://codeforces.com/problemset/problem/443/B

 

思路

如果补充字符长度k大于等于s长度,则新的字符串,一份两半,

前半分包括s,可能包括部分补充的字符,

后半部分,则是完全的补充字符,可以完全匹配前半分字符,这时候的tandem repeat长度则是总长度的一半。

 

对于补充字符长度k小于s长度情况,

首先要准备一个tandem repeat判定函数,

然后,从“最大可能tandem repeat长度”开始判定, 这个长度就是k+s.size的一半,

如果满足判定函数,则打印tandem repeat长度

如果不满足判定函数,则“最大可能tandem repeat长度”减1, 再次进行判定,依此判定,直到减少到1为止。

 

Code

reference to

https://codeforces.com/submissions/chuanyu.fan

#include <bits/stdc++.h>
#include <iostream>
#include <string>
using namespace std;
string s;
int n,sz;
bool istare(int m){
    for(int i=0;i+2*m<=sz+n;i++){
        bool ok=1;
        for(int j=0;j<m;j++){
            if(i+j+m>=sz){
                break;
            }
            if(s[i+j]!=s[i+j+m]){
                ok=0;
//                if(m==3){
//                    cout<<i+j<<"!="<<i+j+m<<endl;
//                }
                break;
            }
            /*
            else if(m==3){
                cout<<j<<endl; 
            }
            */
        }
        if(ok){
            return 1;
        }
    }
    return 0;
}
int main(){
    cin>>s>>n;
    sz=s.size();
    if(n>=sz){
        cout<<(n+sz)/2*2<<endl;
        return 0;
    }
    for(int i=(n+sz)/2;i>=1;i--){
        if(istare(i)){
            cout<<i*2<<endl;
            return 0;
        }
    }
} 

 

posted @ 2023-01-08 23:22  lightsong  阅读(49)  评论(0)    收藏  举报
千山鸟飞绝,万径人踪灭