匹配

匹配

题目大意

有多组数据,每组数据有以下东西:
1.一个n。
2.一串有n个字母的字符串。
然后A…M分别与Z…N配对(如A,Z),然后一个配对中的左边若在另一个配对中,另一边也一定要在这个配对中才算配对。
配对输出1,否则输出0。

输入样例

12
AabcZBBefYeY

输出样例

1

数据范围

50%的数据:N<=1000
100%的数据:N<=1000000

思路

这道题就是模拟。
分左括号和右括号两种情况处理,如果一一对应就输出1,否则输出0,就可以了。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
string c;
bool t;
int n,a[1000001],f;
int main()
{
//	freopen("match.in","r",stdin);
//	freopen("match.out","w",stdout);
	scanf("%d",&n);//读入
	while(n)
	{
		t=0;
		f=0;
		memset(a,0,sizeof(a));//初始化
		cin>>c;//读入
		for (int i=0;i<n;i++)
		{
			if (c[i]>='A'&&c[i]<='M')//处理左括号情况
			{
				f++;
				a[f]=c[i]-'A'+1;
			}
			else if (c[i]>='N'&&c[i]<='Z')//处理右括号情况
			{
				if(a[f]=='Z'-c[i]+1) {a[f]=0;f--;}
				else {t=1;break;}
			}
		}
		if(f) t=1;
		if (t) printf("0\n");//不配对
		else printf("1\n");//配对
		n=0;
		scanf("%d",&n);//读入
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值