建设网站需要注意什么问题,做视频网站的挣钱吗,南沙网站建设方案,wordpress新用户提醒警察阿纳托利再次监视一个无组织犯罪集团散布被禁止的亚洲绘画的巢穴。目前#xff0c;犯罪分子还共享无线互联网#xff0c;任何人都可以匿名使用。巢穴仍然只有一个入口#xff0c;也是一个出口。当有人进入巢穴时#xff0c;阿纳托利在他的记事本上写一个开口圆括号犯罪分子还共享无线互联网任何人都可以匿名使用。巢穴仍然只有一个入口也是一个出口。当有人进入巢穴时阿纳托利在他的记事本上写一个开口圆括号当有人出来时他写一个闭合圆括号。 阿纳托利决定不吃甜甜圈以免像前一次那样破坏记录但尽管如此当他从记事本上撕下一张纸来提交刑事案件时却不小心把它撕成了碎片。他不想让老板对他大喊大叫所以他必须按照正确的顺序连接部件来恢复记录。记事本的布局可以确定这些碎片的顶部和底部这对他来说很好。阿纳托利在开始监视之前和结束监视之后都确保罪犯的巢穴是空的。
输入 输入第一行包含单个整数 n1 ≤ n ≤ 2e5——写有开括号和闭括号的纸张的张数。 接下来的 n 行只包含字符 “(” 和 “)” ——这些是写在片段上的字符串。括号的总数不超过2e5个。
输出 如果给定的部分可以连接这样得到的字符串就不会与语句相矛盾则在第一行 ”YES“ 中输出不带引号。在第二行中输出n个由空格分隔的整数——它们必须连接的顺序中的个数。这些片段按照输入中提到的顺序从一开始编号。 如果Anatoliy搞砸了什么并且给定的片段不能形成正确的记录则在没有引号的唯一一行 ”NO“ 中输出。
Input1 3 ( () ) Output1 YES 1 2 3
Intput2 3 ))) (( ( Output2 YES 2 3 1
Input3 3 ))) (( ) Output3 NO
解析在代码中
#include bits/stdc.h
using namespace std;
#define int long long
#define endl \n
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pairint,int PII;
const double PIacos(-1.0);
const int N2e610;
int n;
stack char q;
struct node
{int l,r,id;
}a[N],b[N],c[N],d[N]; //分四组
bool cmp1(node x,node y) //按照右括号从小到大排序 此时lr,剩下的左括号有利于后续右括号的抵消
{if (x.r!y.r) return x.ry.r;else return x.ly.l;
}
bool cmp2(node x,node y) //按照左括号从大到小排序 (对不起我也很迷~~)
{if (x.l!y.l) return x.ly.l;else return x.ry.r;
}
string p;
void solve()
{cinn;int l10,l20,l30,l40;for (int k0;kn;k){cinp;for (int i0;ip.size();i) //先消{if (q.empty()) q.push(p[i]);else if (q.top()(p[i])) q.pop();else q.push(p[i]);}int l0,r0;while (q.size()) {if (q.top()() l;else r;q.pop();}if (l0r0) a[l1].l0,a[l1].r0,a[l1].idk1; //分组 1.只有左括号或没有else if (l!0r0) a[l1].ll,a[l1].r0,a[l1].idk1; // 2.左括号大于等于右括号else if (l!0r!0) // 3.右括号大于左括号{ // 4.只有右括号if (lr) b[l2].ll,b[l2].rr,b[l2].idk1;else d[l4].ll,d[l4].rr,d[l4].idk1;}else if (l0r!0) c[l3].l0,c[l3].rr,c[l3].idk1;}sort (b,bl2,cmp1);sort (d,dl4,cmp2);bool falg1; //之后暴力判断int cnt0; for (int i0;il1;i) cnt a[i].l; for (int i0;il2;i){int lb[i].l,rb[i].r;cnt -r;if (cnt0){falg0;break;}cnt l;}for (int i0;il4;i){int ld[i].l,rd[i].r;cnt -r;if (cnt0){falg0;break;}cnt l;}for (int i0;il3;i){cnt -c[i].r;if (cnt0){falg0;break;}}if (cnt!0) falg0;if (falg){coutYES\n;for (int i0;il1;i) couta[i].id ;for (int i0;il2;i) coutb[i].id ;for (int i0;il4;i) coutd[i].id ;for (int i0;il3;i) coutc[i].id ;}else coutNO;
}
signed main()
{ios;int T1;//cinT;while (T--) solve(); return 0;
}