cf(div4) 第四周
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; }
D. Product of Binary Decimals
题解:我的是用两个dfs跑即可
一个跑出全部的01串,一个跑出这些串相乘在一起的可能值
然后map记录就可以了
#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=1e5+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; } int n; vector<int> a; map<int,int> mp; void dfs(int x) { if(x>N) return; mp[x]=1; a.push_back(x); dfs(x*10); dfs(x*10+1); } void dfs2(int x) { if(x>N) return; mp[x]=1; for(int i=2;i<31;i++) { dfs2(x*a[i]); } } void solve() { cin>>n; if(mp[n]==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } signed main(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T=1; cin>>T; dfs(1); dfs2(1); while(T--){ solve(); } return 0; }