321
社区成员




有四种括号:大括号{}、中括号[]、小括号()和尖括号<>。它们之间不能错套,且需要配对。 错套的意思是:某种括号的前半部分和后半部分之间,仅套着不同类括号的某一半部分而没有另一半部分。错套的样例如下: <<<>>{>([hello[]]}){world} 因为在尖括号的前半部分和后半部分之间,仅套着大括号的前半部分而没有后半部分。 配对的意思是:如果出现了某种括号的前半部分,则必须在之后有同样数量的同类括号的后半部分与之对应;反之如果出现了某种括号的后半部分,则必须在之前有同样数量的同类括号的前半部分与之对应。正确的配对样例如下: <<<>>>({[hello[]]}){world} 错误的配对样例如下: ))<<<>>([hello[]]){world} 因为前2小括号只有后半部分而缺失了前半部分,而尖括号的前半部分有3个,而后半部分只有2个。
单行文本(字符数小于100000)。
如果括号正确匹配(即不存在错套且都正确配对),则按大、中、小、尖的顺序输出实际存在的各类括号的数量(如果不存在就不输出)。
格式形如: 20[]6<>
以上输出代表括号正确匹配,且没有大括号、有20对中括号、没有小括号、有6对尖括号。如对于描述中正确的配对样例应该输出: 2{}2[]1()3<>
如果存在错套,则输出第一处错套的前后半个括号,并附一个感叹号(!)。如对于描述中错套的样例应该输出: {>!
如果不存在错套,但存在错误的配对,则大、中、小、尖各自前半部分在先、后半部分在后的顺序输出缺少的括号数量(不输出正确匹配的括号数量)。
格式形如: 4}7(9)16<
以上输出代表不存在错套,但存在错误的配对,其中有4对大括号只有前半部分而缺少后半部分,有7对小括号只有后半部分而缺少前半部分、有9对小括号只有前半部分而缺少后半部分、有16对尖括号只有后半部分而缺少前半部分。如对于描述中错误的配对样例应该输出: 2(1>
又一个新题目,这个题目倒是能直接AC,但是。。。。这是阅读理解题,要仔细阅读输出格式,如果格式有问题,那就只能 60% pass 了。
为了避免干扰周赛,暂时先不放代码。
现在放出来比赛时的代码,嗯,前边那一版其实也不是最初版本,而是减少 if 的版本,这一版 if 用的就多了点,包括推导式里的,以及用 or 代替的,算是应该有10个 if 分支了
s = input()
c,p = '{}[]()<>',[]
t = ['','','']
for i in s:
if i not in c:continue
elif c.index(i) % 2 == 0:p.append(i)
elif len(p) == 0:t[1] += c[c.index(i) ^ 1]
elif p[-1] == c[c.index(i) ^ 1]:t[2] += p.pop()
else:
t[0] = p.pop() + i + '!'
break
t[1] += ''.join([c[c.index(v) ^ 1] for v in p])
t[1] = ''.join([str(t[1].count(v)) + v for v in c if t[1].count(v) > 0])
t[2] = ''.join([str(t[2].count(v)) + v + c[c.index(v) ^ 1] for v in c if t[2].count(v) > 0])
print(t[0] or t[1] or t[2])
先来个预习版的,放心,和我今天周赛提交的内容,只有思路一样,写法完全不一样
import re
s = re.sub(r'[^\{\}\[\]\(\)<>]','',input())
st,stack = '{}[]()<>',[]
t = ['',st,st]
for i in s:
if st.index(i) % 2 == 0:
stack.append(i)
elif len(stack) == 0:
i = st[st.index(i) ^ 1]
t[1] = re.sub('\\d*\\' + i,str(int('0' + re.search('\\d*(?=\\' + i + ')',t[1]).group(0)) + 1) + i,t[1])
elif stack[-1] == st[st.index(i) ^ 1]:
i = stack.pop()
t[2] = re.sub('\\d*\\' + i,str(int('0' + re.search('\\d*(?=\\' + i + ')',t[2]).group(0)) + 1) + i,t[2])
else:
t[0] = stack.pop() + i + '!'
break
for i in set(stack):
t[1] = t[1].replace(st[st.index(i) ^ 1],str(stack.count(i)) + st[st.index(i) ^ 1])
t[1] = re.sub('(?<!\d)[\{\}\[\]\(\)<>]','',t[1])
t[2] = re.sub('(?<!\d)(\\{\}|\[\]|\(\)|<>)','',t[2])
print(t[0] or t[1] or t[2])