牛客算法周周练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;
}
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;
}
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;
}