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; }