牛客算法周周练20

传送门

A.兔子的名字

大意:给一些串,问输入的串中存在几个给定的子串。

#include<bits/stdc++.h>
using namespace std;
int judge(string a,string b){
    int s=0;
    for(int i=0;i<a.size();i++){
        if(s==b.size())break;
        if(a[i]==b[s])s++;

    }
    if(s==b.size())return 1;
    else return 0;
}
int main(){
    int n,m;cin>>n>>m;
    string a[1005];
    string b[1005];
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<m;i++)cin>>b[i];
    for(int i=0;i<n;i++){
        int sum=0;
        for(int j=0;j<m;j++){
            if(judge(a[i],b[j]))sum++;
        }
        cout<<sum<<endl;
    }
View Code

B.Phrase String

大意:给出v, k,请你找到最小的正整数n,满足:

n的二进制表示下存在一个长度为v的回文串,该回文串首尾都是1且n的二进制表示中至少有k个1。保证v,k均为偶数!结果对1e9+7取模。

思路:取v和k的较大值作为二进制串的长度,首尾取1,并根据K的大小,从中间往外两两填充1,保证了回文,并且结果也是最小的。

#include<bits/stdc++.h>
using namespace std;
int a[100005];
long long int mod=1e9+7;
int main(){
    int v,k;cin>>v>>k;
    v=max(v,k);
     a[1]=1;a[v]=1;
    int left=v/2;
    int right=v/2+1;
    int pos=k-2;
    while(pos!=0){
        a[left]=1;
        a[right]=1;
        left--;right++;
        pos-=2;
    }
    long long int f=1,sum=0;
    for(int i=1;i<=v;i++){
        if(a[i]){
            sum+=f;
            sum%=mod;
        }
        f*=2;
        f%=mod;
    }
    cout<<sum<<endl;
    return 0;
}

C题 不会

D.赞迪卡之声妮莎与奥札奇

大意:给一个点数为n的完全图,每条边走一次,问最后先手胜还是后手胜

思路:n=1时,后手胜,n=2 or 3时先手胜,当n>=4时,先手总可以把后手逼到一个点(死角),即>=2都是先手胜

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t,n;cin>>t;
    for(int i=1;i<=t;i++){
        cin>>n;
        if(n==1){cout<<"Kozilek, Butcher of Truth"<<endl;}
        else{cout<<"Ulamog, the Infinite Gyre"<<endl;}
    }
    return 0;
}
View Code

E.msc的宠物 还没看

F.紫魔法师

大意:给出一棵仙人掌(每条边最多被包含于一个环,无自环,无重边,保证连通),要求用最少的颜色对其顶点染色,满足每条边两个端点的颜色不同,输出最小颜色数即可,n、m<=200000

思路:无向连通图染色最多3种颜色,特判n=1输出1,然后判断是不是二分图,是的话输出2,不是的话输出3;暴力即可。

#include<bits/stdc++.h>
using namespace std;
int vis[100005];
vector<int>d[100005];
int n,m,u,v;
int dfs(int u){
    int c=1;
    if(vis[u]==-1)vis[u]=c,c=0;
    else c=vis[u]^1;
    for(int i=0;i<d[u].size();i++){
        if(vis[d[u][i]]==-1){
            vis[d[u][i]]=c;
            if(!dfs(d[u][i]))return 0;
        }
        else if(vis[d[u][i]]==vis[u])return 0;
    }
    return 1;
}
int main(){
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>u>>v;
        d[u].push_back(v);
        d[v].push_back(u);
    }
    fill(vis,vis+100005,-1);
    if(n==1){
        puts("1");
    }
    else if(dfs(1)){
        puts("2");
    }
    else puts("3");
    return 0;
}

 

posted @ 2020-08-18 23:04  mohari  阅读(142)  评论(0编辑  收藏  举报