hihoCoder 挑战赛7(正则表达式-栈)

题目1 : 正则表达式

时间限制:1000ms

单点时限:1000ms

内存限制:256MB

描述

给定一个字符串,判断其是否为合法的正则表达式。

一个正则表达式定义为:

1:0是正则表达式,1也是正则表达式。

2:P和Q都是正则表达式,则PQ是正则表达式。

3:P是正则表达式,则(P)是正则表达式

4:P是正则表达式,则P*也是正则表达式

5:P和Q都是正则表达式,则P|Q是正则表达式。

输入

输入包含多组数据。

每组数据为一行一个字符串,长度不超过100。

输出

对于每组数据,如果输入是合法的正则表达式,输出yes,否则输出no。

样例输入
010101101*
(11|0*)*
)*111
样例输出
yes
yes
no

用栈去判断(),剩余的暴力判断

如果(xx)成立,就令(xx)=11..11 视为1个表达式。

注意以下数据

() no

0|,0||,0||1,0|* no

)( no

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (1000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
char s[MAXN];
int n,st[MAXN],tail;
bool check2(int a,int b)
{
	bool now=0;
	Fork(j,a+1,b-1)
	{
		if (s[j]=='0') now=1;
		else if (s[j]=='*')
		{
			if (now==0) return 0;
		}
		else if (s[j]=='|')
		{
			if (now==0) return 0;
			now=0;
		}
	}
	if (s[b-1]=='|') return 0;
	Fork(j,a,b) s[j]='0';
	return 1;
}
bool check3(int a,int b)
{
	bool now=0;
	Fork(j,a,b)
	{
		if (s[j]=='0') now=1;
		else if (s[j]=='*')
		{
			if (now==0) return 0;
		}
		else if (s[j]=='|')
		{
			if (now==0) return 0;
			now=0;
		}
	}
	if (s[b]=='|') return 0;
	return 1;
}
bool check()
{
	tail=0;
	Rep(i,n)
		if(s[i]=='1'||s[i]=='0') s[i]='0';
		else if (s[i]!='('&&s[i]!=')'&&s[i]!='*'&&s[i]!='|') return 0;

	Rep(i,n)
	{
		if (s[i]=='(') st[++tail]=i;
		else if (s[i]==')')
		{
			if (!tail) return 0;
			int a=st[tail--],b=i;
			if (a+1==b) return 0;
			if (!check2(a,b)) return 0;
		}
	}
	if (tail) return 0;
	if (!check3(0,n-1)) return 0;
	return 1;
}
int main()
{
//	freopen("regular.in","r",stdin);
	while(scanf("%s",s)==1)
	{
		n=strlen(s);
		if (n==0) break;

		if (check()) cout<<"yes"<<endl;
		else cout<<"no"<<endl;

	}

	return 0;
}
时间: 2025-01-17 21:07:10

hihoCoder 挑战赛7(正则表达式-栈)的相关文章

统计hihoCoder挑战赛成绩的Python脚本

2月有两场比赛,总分前八的有纪念品.第一场排第11,要拿到奖品毫无把握..心血来潮写了个用来计算几场比赛总分排名的脚本,好让自己第一时间知道能不能得奖(囧),也稍微试下BeautifulSoup. # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import urllib def updateScoreList(scoreList, url): """ :param scoreList: :param url: :r

hihoCoder挑战赛11.题目4 : 高等理论计算机科学(LCA)

clj在某场hihoCoder比赛中的一道题,表示clj的数学题实在6,这道图论貌似还算可以... 题目链接:http://hihocoder.com/problemset/problem/1167 由于是中文题目,题意不再赘述. 对于任意两条小精灵的活动路径a和b,二者相交的判断条件为b的两个端点的LCA在a的路径上:那么我们可以首先将每个活动路径端点的LCA离线预处理出来,对每个节点LCA值+1. 然后以某个节点(我选择的是节点1)为根进行深搜,算出一条从节点1到节点x的LCA值和,那么任意

hihoCoder挑战赛11 随机斐波那契

题目链接:http://hihocoder.com/problemset/problem/1164 题面: #1164 : 随机斐波那契 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). 现在考虑如下生成的斐波那契数列: a0 = 1, ai = aj + ak, i > 0, j, k从[0, i-1]的整数中随机选出(j和k独立). 现在给定n,要

hihoCoder挑战赛11 益智游戏

题目链接:http://hihocoder.com/problemset/problem/1165 题面: 益智游戏 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幽香今天心情不错,正在和花田里的虫子玩一个益智游戏. 这个游戏是这样的,对于一个数组A,幽香从A中选择一个数a,虫子从A中选择一个数b.a和b可以相同.她们的分数是a*b的因子的个数. 幽香和虫子当然想要获得尽可能的高的分数,你能告诉她们应该选择哪两个数吗. 由于幽香是个非常随意的人,数组A中的元素都是

hihoCoder挑战赛12 顺子(hihocoder 1177)

题目链接:http://hihocoder.com/problemset/problem/1177 题面: #1177 : 顺子 时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 你在赌场里玩梭哈,已经被发了4张牌,现在你想要知道发下一张牌后你得到顺子的概率是多少? 假定赌场使用的是一副牌,四种花色的A.2.3.....J.Q.K共52张,这副牌只发给你了4张,你的剩下一张牌从剩下48张中任意取出一张. 顺子指的是点数连续的五张牌,包括10.J.Q.K.A这种牌型(不包

hihoCoder挑战赛1 毁灭者问题

题目链接:http://hihocoder.com/problemset/problem/1034 数据结构题,由于每个魔法单位有着不同的回复速度和上限,所以不能根据吸收时间点进行查询和更新.但是如果知道每个人在哪些时间点被吸收了,那么可以按照每个单位的情况更新,具体操作是:时间间隔超过Mi/Ri的则被吸收的值为Mi(设这样的间隔有x个),否则为Ri*时间间隔(设这样的间隔总时间长度为y),此魔法单位被吸收的总量为x*Mi+y*Ri. 如何快速求每个单位在哪些时间被吸收:维护一个有序序列记录时间

ACM学习历程—Hihocoder 1177 顺子(模拟 &amp;&amp; 排序 &amp;&amp; gcd)(hihoCoder挑战赛12)

时间限制:6000ms 单点时限:1000ms 内存限制:256MB   描述 你在赌场里玩梭哈,已经被发了4张牌,现在你想要知道发下一张牌后你得到顺子的概率是多少? 假定赌场使用的是一副牌,四种花色的A.2.3.....J.Q.K共52张,这副牌只发给你了4张,你的剩下一张牌从剩下48张中任意取出一张. 顺子指的是点数连续的五张牌,包括10.J.Q.K.A这种牌型(不包含同花顺,即构成顺子的五张牌花色不能相同).参见:https://zh.wikipedia.org/wiki/%E6%92%B

hihoCoder挑战赛4 光棍节

题目3 : 光棍节 时间限制:30000ms 单点时限:1000ms 内存限制:256MB 描述 尽管付出了种种努力,jzp还是得过光棍节. jzp非常不爽,但也无能为力,只能够哀叹起来他的命运.他想到了一位长者的人生经验:“人的一生,不光要靠自我奋斗,也要考虑历史的进程”. 他终于明白自己只是时运不济,所以又继续开始努力.终于在圣诞节当天把到了妹子. jzp从此过上了快乐的现充生活,在圣诞节当天,他还和妹子玩起了有趣的游戏: jzp的家里有一棵非常大的圣诞树,可以看成是一个n个点的无向联通无环

hihoCoder挑战赛28 题目3 : 树的方差

题目3 : 树的方差 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 对于一棵 n 个点的带标号无根树,设 d[i] 为点 i 的度数. 定义一棵树的方差为数组 d[1..n] 的方差 给定 n ,求所有带标号的 n 个点的无根树的方差之和. 你需要将答案对 998244353 取模. 方差的定义:https://en.wikipedia.org/wiki/Variance 输入 仅一行:一个正整数 n 2 ≤ n ≤ 106 输出 仅一行:一个非负整数表示答案 样