ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 P8271 [USACO22OPEN] COW Operations S

2022-06-30 20:02:17  阅读:149  来源: 互联网

标签:Operations USACO22OPEN 运算 COW int 题解 异或 char while


面对这种题目要大胆赋值。

考虑序列肯定可以不停操作,最后剩下可能是:空、COW

我们把空赋值为 \(0\),COW 三个字母分别是 \(1,2,3\)。

操作 \(1\) 对应的是两个相等的数运算后得 \(0\)。操作 \(2\) 则是两个不相等的数运算后得到第三个数。还有一点是 \(0\) 和任何数运算得 \(0\)。

容易发现这就是异或运算!XOR 是具有交换律和结合律的,因此操作结果与顺序无关,就是所有字母的异或值。

所以就一下 XOR 前缀和,每次询问回答就行了。

#include <bits/stdc++.h>
using namespace std;

const int N=500005;
int n,m; 
char a[N];
int s[N];

inline int read()
{
    int F=1,ANS=0;
	char C=getchar();
    while (C<'0'||C>'9')
	{
		if (C=='-') F=-1;
		C=getchar();
	}
    while (C>='0'&&C<='9')
	{
		ANS=ANS*10+C-'0';
		C=getchar();
	}
    return F*ANS;
}

int main()
{
	cin >> (a+1);
	n=strlen(a+1);
	m=read();
	for (int i=1;i<=n;i++)
	{
		if (a[i]=='C') s[i]=(s[i-1]^1);
		else if (a[i]=='O') s[i]=(s[i-1]^2);
		else s[i]=(s[i-1]^3);
	}
	for (int i=1;i<=m;i++)
	{
		int l=read(),r=read(),ans=s[r]^s[l-1];
		if (ans==1) printf("Y");
		else printf("N");
	}
	return 0;
}

标签:Operations,USACO22OPEN,运算,COW,int,题解,异或,char,while
来源: https://www.cnblogs.com/irty/p/16428301.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有