Tandem Repeats?
集体降智题。放普及组 t3 正合适。
根本不用字符串科技,也不用多想,?
只是卡掉哈希做法的。把思路画出来就一眼了:
zaabaabz|zaabaabz |zaabaabz |zaabaabz |zaabaabz |zaabaabz
zaabaabz| zaabaabz| zaabaabz| zaabaabz| zaabaabz | zaabaabz
将字符串复制一份,不断向右移动,再边扫边更新就好了。时间复杂度 。
由于题目要求两个区间相邻,所以更新时需要条件:匹配的字符串长度应等于第二个字符串的偏移量。
#include<bits/extc++.h>
using namespace std;
namespace pbds=__gnu_pbds;
using ui=unsigned int;
using uli=unsigned long long int;
using li=long long int;
bool eq(char a,char b){return a==b||a=='?'||b=='?';}
int main(void){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
size_t T;
cin>>T;
while (T--){
string t;cin>>t;
size_t ans=0;
for (size_t i=0;i<t.size();++i){
size_t d=0;
for (size_t j=i;j<t.size();++j){
if (eq(t[j],t[j-i])) ++d;
else d=0;
if (i==d) ans=max(ans,d*2);
}
}
cout<<ans<<'\n';
}
return 0;
}