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;
}
posted @ 2024-03-16 08:53  MrPython  阅读(4)  评论(0)    收藏  举报  来源