牛客白月赛13题解

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客白月赛13题解相关的知识,希望对你有一定的参考价值。

https://ac.nowcoder.com/acm/contest/549

目录

小A的签到题【规律】


找规律。

#include<bits/stdc++.h>
using namespace std;
int main() 
    long long n;
    scanf("%lld",&n);
    if(n&1) puts("1");
    else puts("-1");
    return 0;

小A的回文串【双指针】


他这个类似于那个环,故可以用两倍的,破环成链的方法搞。双指针跑。

#include<bits/stdc++.h>
using namespace std;
int main(void)

	string s; cin>>s;
	int n=s.size();
	s=s+s;
	int ans=1;
	for(int i=0;i<s.size();i++)
	
		int l=i-1,r=i+1;//字符串的长度为偶数
		int cnt=0;
		while(cnt<n/2&&l>=0&&r<s.size()&&s[l]==s[r]) l--,r++,cnt++;
		ans=max(ans,cnt*2+1); 
		l=i,r=i+1;//字符串的长度为奇数
		cnt=0;
		while(cnt<n/2&&l>=0&&r<s.size()&&s[l]==s[r]) l--,r++,cnt++;
		ans=max(ans,cnt*2);
	
	cout<<ans;
	return 0;

小A买彩票【DP】


f[i][j] 表示买前i个彩票 总和为j的次数

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL n,f[35][500],w[15]=1,2,3,4;
LL gcd(LL a,LL b)return b?gcd(b,a%b):a;
int main(void)

	cin>>n;
    f[0][0]=1;
	for(int i=1;i<=n;i++)
	
		for(int j=0;j<=500;j++)
		
			for(int k=0;k<=3;k++)
			
				int temp=j-w[k];
				if(temp>=0&&f[i-1][temp]) f[i][j]+=f[i-1][temp];//f[i-1][temp]是有的
			
		
	
	LL sum=0,cnt=0;
	for(int i=0;i<=500;i++)
	
		sum+=f[n][i];
		if(i>=3*n) cnt+=f[n][i];
	
	LL temp=gcd(sum,cnt);
	cnt/=temp,sum/=temp;
	cout<<cnt<<"/"<<sum;
	return 0;

小A的位运算【前后缀】

#include<bits/stdc++.h>
using namespace std;
const int N=1e6*5+10;
typedef long long int LL;
LL a[N],cnt[105],n,sum;
int main(void)

	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++) 
		for(int j=0;j<64;j++)
			if(a[i]>>j&1) cnt[j]++;
	LL ans=0;
	for(int i=0;i<n;i++)
	
		sum=0;
		for(int j=0;j<64;j++)//不选
		
			if(a[i]>>j&1) cnt[j]--;
			if(cnt[j]) sum+=1<<j;
		
		for(int j=0;j<64;j++)//恢复状态
			if(a[i]>>j&1) cnt[j]++;
		ans=max(ans,sum);
	
	cout<<ans;
	return 0;

正解,处理前后缀。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6*5+10;
typedef long long int LL;
LL a[N],l[N],r[N],n;
LL ans=0;
int main(void)

	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) l[i]=l[i-1]|a[i];
	for(int i=n;i>=1;i--) r[i]=r[i+1]|a[i];
	for(int i=1;i<=n;i++)
	
		LL temp=l[i-1]|r[i+1];
		ans=max(ans,temp);
	
	cout<<ans;
	return 0;

以上是关于牛客白月赛13题解的主要内容,如果未能解决你的问题,请参考以下文章

牛客白月赛4 题解

牛客白月赛11题解

牛客白月赛12题解

牛客白月赛10题解

牛客白月赛14题解

牛客白月赛32题解