蒜头君在纸上写了一个串,只包含'('
和')'
。一个'('
能唯一匹配一个')'
,但是一个匹配的'('
必须出现在')'
之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。
输入格式
一行输入一个字符串只含有'('
和')'
,输入的字符串长度不大于
500005000050000。
输出格式
如果输入括号不能匹配,输出一行"No"
,否则输出一行"Yes"
,接下里若干行每行输出
222
个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 111
开始)。你可以按照任意顺序输出。
本题答案不唯一,符合要求的答案均正确
样例输入1
(())
样例输出1
Yes 1 4 2 3
样例输入2
()()
样例输出2
Yes 1 2 3 4
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <stack> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; stack<char> s; char c[50010]; int b[50010]; int main(int argc, char *argv[]) { int i,p=0,q=0,k; scanf("%s",c); for(i=0;i<strlen(c);i++) { if(c[i]=='(') { s.push(c[i]); b[++q]= i; } if(c[i]==')') { if(s.empty()) { printf("No"); return 0; } if(!s.empty()) { s.pop(); // printf("%d %d\n",b[q--]+1,i+1); } } if(i==strlen(c)-1) { if(!s.empty()) { printf("No"); return 0; } } } printf("Yes\n"); q=0; for(i=0;i<strlen(c);i++) { if(c[i]=='(') { s.push(c[i]); b[++q]= i; } if(c[i]==')') { if(s.empty()) { printf("No"); return 0; } if(!s.empty()) { s.pop(); printf("%d %d\n",b[q--]+1,i+1); } } } return 0; }