cf(div4) 第四周

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

 Problem - D - Codeforces

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

 

posted @ 2024-03-31 16:02  whatdo+  阅读(15)  评论(0编辑  收藏  举报