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; } } }
标签:sz,Repeat,--,codeforces,tandem,判定,长度,Tandem,repeat From: https://www.cnblogs.com/lightsong/p/17035735.html