step1_入门_ACM趣味题 破译密码

http://acm.hdu.edu.cn/showproblem.php?pid=1287

思路

这道题需要动点脑子哟!!

我的思路是这样的:先将题目给出的数组保存在数组arr中,然后判断这串数据可以由哪个大写字母产生。

对每个数据,用ain[t]标记一下,代表t在这组数据中出现过,t不会超过35,可以用任意两个大写字母试一下,不会超过35的。

这个位置我写了一个for循环,变量i从A变化到Z,

                   如果i情况下这组数据合法,则对每一个在这组数据中出现过的数据 (ain[j]==1)  j

                   都会有(i^j)>='A'  <="Z"

否则,寻找下一个i。

本题的坑

做异或的题比较少,关于运算符优先级的理解不是很深刻,之前豪心壮志的说遇见不清楚优先级的情况就加()。结果当遇见优先级问题的时候,找了半天才找见是运算级不准确出的bug!!!

所以,请大概了解一下优先级排布,争取下次别犯这样低级的错误了。

AC代码

#include
#include 
#include
#include
using namespace std;
bool a[27][35];
int arr[10000];
int ain[35];

int main(){

     std::ios::sync_with_stdio(false);
     std::cin.tie(0);
//     for(int i='A';i<='Z';i++){
//	 	for(int j='A';j<='Z';j++){
//		 	int b=i^j;
//		 	a[i-'A'][b]=true;//代表b位存在 
//		 	cout<>n){ 
	 	memset(ain,0,sizeof(int)*35);
	     for(int i=0;i>t;
	     	arr[i]=t;
	     	ain[t]=1;
		 }
		 bool flag=true;
		 for(int i='A';i<='Z';i++){
		 	flag=true;
		 	for(int j=0;j<35;j++){
		 		if(ain[j]==1){
		 			if((j^i)<'A'||(j^i)>'Z'){//这个位置需要加上() 
					 //!!!!!注意优先级的问题,^符号的优先级比>符号更早地被运算掉。 
		 				flag=false;
						break;	
					}
				}
			 }
			 if(flag){
			 	for(int j=0;j

 

你可能感兴趣的:(2018年为准备CCF,CSP的第二遍刷题)