cf(div4) 第四周

發表於2024-03-31

Problem - E - Codeforces

E. Nearly Shortest Repeating Substring

題解:我們直接列舉長度

題目限制很多

首先,列舉長度要確保整除

然後我們在取從頭開始的這個長度的字串一一向下比對

這裡我們還要去這個長度的i+=len下一個字串在一一去比對

然後就不可能往下取了,如果向下取那就說明前面兩個串都不對,那麼匹配就會大於1,不符合題目條件,所以我們只需要列舉前兩個同長度的字串即可

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
#define endl '\n'
using namespace std;
const int N=1e6+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}


void solve()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    for(int len=1;len<=n;len++)
    {
        if(n%len!=0) continue;

        for(int i=0;i<n && i<=len;i+=len)
        {
            int ans=0;
            for(int j=0;j<n;j++)
            {
                ans+=(s[i+j%len]!=s[j]);
            }
            if(ans<=1)
            {
                cout<<len<<endl;
                return;
            }
        }
    }

}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

相關文章