// a3.cpp
#include <stdio.h>
struct Check {
const char* text; int len;
int *L,*R; int nl,nr, lim, count;
int check() {
int level, rm_close, rm_open,i; char c;
nr=0; nl=0; L[0]=0; L[1]=0; R[0]=0; R[1]=0;
level=0; rm_close=0; rm_open=0; c=0;
for(i=0;c=text[i];i++) {
if (c=='(') level++;
if (c==')') { L[nl]++; if (level>0) level--; else { L[nl+1]++; rm_close++; } }
else { if (L[nl]) { nl+=2; if (nl+2>=lim) throw this; L[nl]=0; L[nl+1]=0; } }
}
rm_open=level; level=0; len=i;
for(--i;i>=0;i--) {
c=text[i];
if (c==')') level++;
if (c=='(') { R[nr]++; if (level>0) level--; else R[nr+1]++; }
else { if (R[nr]) { nr+=2; if (nl+2>=lim) throw this; R[nr]=0; R[nr+1]=0; } }
}
if (!L[nl]) nl-=2; if (!R[nr]) nr-=2;
if (rm_close || rm_open) printf("\"%s\" - %d лишних \")\" и %d лишних \"(\"\n",text,rm_close,rm_open);
return rm_close+rm_open;
}
void show() {
count++;
//printf("%-6d ",count);
/*
for(int pl=0,pr=nr,i=0;i<len;i++) {
int n=1; char c=text[i];
if (c==')') { i+=L[pl]-1; n=L[pl]-L[pl+1]; pl+=2; }
if (c=='(') { i+=R[pr]-1; n=R[pr]-R[pr+1]; pr-=2; }
for(int j=0;j<n;j++) putchar(c);
}
putchar('\n');
*/
}
void right(int p,int s=1) {
if (s) show();
while(p>=0 && R[p+1]==0) p-=2;
if (p>=0) {
int i=p-2; while(i>=0 && R[i+1]>=R[i]) i-=2;
if (i>=0) { right(p-2,0); right_dec(p,i); }
}
}
void right_dec(int p,int i) {
R[i+1]++; R[p+1]--; right(p-2);
if (R[p+1]>0) {
int j=i; while(j>=0 && R[j+1]>=R[j]) j-=2;
if (j>=0) right_dec(p,j);
}
R[i+1]--; R[p+1]++;
}
void left(int p,int s=1) {
if (s) right(nr);
while(p>=0 && L[p+1]==0) p-=2;
if (p>=0) {
int i=p-2; while(i>=0 && L[i+1]>=L[i]) i-=2;
if (i>=0) { left(p-2,0); left_dec(p,i); }
}
}
void left_dec(int p,int i) {
L[i+1]++; L[p+1]--; left(p-2);
if (L[p+1]>0) {
int j=i; while(j>=0 && L[j+1]>=L[j]) j-=2;
if (j>=0) left_dec(p,j);
}
L[i+1]--; L[p+1]++;
}
void show_variants() {
count=0; left(nl);
printf("count=%d\n",count);
}
};
int main(int argc,char** argv) {
enum { limit=128 };
int L[limit],R[limit];
const char* list[]={
//"(a)())()))((b(b)",
"()(())(()())(())((())()))))))()))))(((((()(((((())(()())((())(()()))",
argc>1 ? argv[1] : 0,
0
};
for(const char** s=list;*s;s++) {
Check c; c.L=L; c.R=R; c.lim=limit; c.text=*s;
try {
if (c.check()) c.show_variants();
} catch(Check*) {
printf("limit exceeded - %s\n",*s);
}
}
return 0;
}
Ly8gYTMuY3BwCiNpbmNsdWRlIDxzdGRpby5oPgoKc3RydWN0IENoZWNrIHsKICAgIGNvbnN0IGNoYXIqIHRleHQ7IGludCBsZW47CiAgICBpbnQgKkwsKlI7IGludCBubCxuciwgbGltLCBjb3VudDsKICAgIGludCBjaGVjaygpIHsKICAgICAgICBpbnQgbGV2ZWwsIHJtX2Nsb3NlLCBybV9vcGVuLGk7IGNoYXIgYzsKICAgICAgICBucj0wOyBubD0wOyBMWzBdPTA7IExbMV09MDsgUlswXT0wOyBSWzFdPTA7CiAgICAgICAgbGV2ZWw9MDsgcm1fY2xvc2U9MDsgcm1fb3Blbj0wOyBjPTA7CiAgICAgICAgZm9yKGk9MDtjPXRleHRbaV07aSsrKSB7CiAgICAgICAgICAgIGlmIChjPT0nKCcpIGxldmVsKys7CiAgICAgICAgICAgIGlmIChjPT0nKScpIHsgTFtubF0rKzsgaWYgKGxldmVsPjApIGxldmVsLS07IGVsc2UgeyBMW25sKzFdKys7IHJtX2Nsb3NlKys7IH0gfSAKICAgICAgICAgICAgZWxzZSB7IGlmIChMW25sXSkgeyBubCs9MjsgaWYgKG5sKzI+PWxpbSkgdGhyb3cgdGhpczsgTFtubF09MDsgTFtubCsxXT0wOyB9IH0KICAgICAgICB9CiAgICAgICAgcm1fb3Blbj1sZXZlbDsgbGV2ZWw9MDsgbGVuPWk7CiAgICAgICAgZm9yKC0taTtpPj0wO2ktLSkgewogICAgICAgICAgICBjPXRleHRbaV07ICAgICAgICAKICAgICAgICAgICAgaWYgKGM9PScpJykgbGV2ZWwrKzsKICAgICAgICAgICAgaWYgKGM9PScoJykgeyBSW25yXSsrOyBpZiAobGV2ZWw+MCkgbGV2ZWwtLTsgZWxzZSBSW25yKzFdKys7IH0gCiAgICAgICAgICAgIGVsc2UgeyBpZiAoUltucl0pIHsgbnIrPTI7IGlmIChubCsyPj1saW0pIHRocm93IHRoaXM7IFJbbnJdPTA7IFJbbnIrMV09MDsgfSB9CiAgICAgICAgfQogICAgICAgIGlmICghTFtubF0pIG5sLT0yOyBpZiAoIVJbbnJdKSBuci09MjsKICAgICAgICBpZiAocm1fY2xvc2UgfHwgcm1fb3BlbikgcHJpbnRmKCJcIiVzXCIgLSAlZCDQu9C40YjQvdC40YUgXCIpXCIg0LggJWQg0LvQuNGI0L3QuNGFIFwiKFwiXG4iLHRleHQscm1fY2xvc2Uscm1fb3Blbik7CiAgICAgICAgcmV0dXJuIHJtX2Nsb3NlK3JtX29wZW47CiAgICB9CiAgICB2b2lkIHNob3coKSB7CiAgICAgICAgY291bnQrKzsKICAgICAgICAvL3ByaW50ZigiJS02ZCAiLGNvdW50KTsKICAgICAgICAvKgogICAgICAgIGZvcihpbnQgcGw9MCxwcj1ucixpPTA7aTxsZW47aSsrKSB7CiAgICAgICAgICAgIGludCBuPTE7IGNoYXIgYz10ZXh0W2ldOyAKICAgICAgICAgICAgaWYgKGM9PScpJykgeyBpKz1MW3BsXS0xOyBuPUxbcGxdLUxbcGwrMV07IHBsKz0yOyB9CiAgICAgICAgICAgIGlmIChjPT0nKCcpIHsgaSs9Ultwcl0tMTsgbj1SW3ByXS1SW3ByKzFdOyBwci09MjsgfQogICAgICAgICAgICBmb3IoaW50IGo9MDtqPG47aisrKSBwdXRjaGFyKGMpOwogICAgICAgIH0KICAgICAgICBwdXRjaGFyKCdcbicpOwogICAgICAgICovCiAgICB9CiAgICB2b2lkIHJpZ2h0KGludCBwLGludCBzPTEpIHsKICAgICAgICBpZiAocykgc2hvdygpOwogICAgICAgIHdoaWxlKHA+PTAgJiYgUltwKzFdPT0wKSBwLT0yOwogICAgICAgIGlmIChwPj0wKSB7CiAgICAgICAgICAgIGludCBpPXAtMjsgd2hpbGUoaT49MCAmJiBSW2krMV0+PVJbaV0pIGktPTI7CiAgICAgICAgICAgIGlmIChpPj0wKSB7IHJpZ2h0KHAtMiwwKTsgcmlnaHRfZGVjKHAsaSk7IH0KICAgICAgICB9ICAgIAogICAgfQogICAgdm9pZCByaWdodF9kZWMoaW50IHAsaW50IGkpIHsKICAgICAgICBSW2krMV0rKzsgUltwKzFdLS07IHJpZ2h0KHAtMik7CiAgICAgICAgaWYgKFJbcCsxXT4wKSB7CiAgICAgICAgICAgIGludCBqPWk7IHdoaWxlKGo+PTAgJiYgUltqKzFdPj1SW2pdKSBqLT0yOwogICAgICAgICAgICBpZiAoaj49MCkgcmlnaHRfZGVjKHAsaik7CiAgICAgICAgfQogICAgICAgIFJbaSsxXS0tOyBSW3ArMV0rKzsKICAgIH0gICAgCiAgICB2b2lkIGxlZnQoaW50IHAsaW50IHM9MSkgewogICAgICAgIGlmIChzKSByaWdodChucik7CiAgICAgICAgd2hpbGUocD49MCAmJiBMW3ArMV09PTApIHAtPTI7CiAgICAgICAgaWYgKHA+PTApIHsKICAgICAgICAgICAgaW50IGk9cC0yOyB3aGlsZShpPj0wICYmIExbaSsxXT49TFtpXSkgaS09MjsKICAgICAgICAgICAgaWYgKGk+PTApIHsgbGVmdChwLTIsMCk7IGxlZnRfZGVjKHAsaSk7IH0KICAgICAgICB9ICAgIAogICAgfQogICAgdm9pZCBsZWZ0X2RlYyhpbnQgcCxpbnQgaSkgewogICAgICAgIExbaSsxXSsrOyBMW3ArMV0tLTsgbGVmdChwLTIpOwogICAgICAgIGlmIChMW3ArMV0+MCkgewogICAgICAgICAgICBpbnQgaj1pOyB3aGlsZShqPj0wICYmIExbaisxXT49TFtqXSkgai09MjsKICAgICAgICAgICAgaWYgKGo+PTApIGxlZnRfZGVjKHAsaik7CiAgICAgICAgfQogICAgICAgIExbaSsxXS0tOyBMW3ArMV0rKzsKICAgIH0KICAgIHZvaWQgc2hvd192YXJpYW50cygpIHsKICAgICAgICBjb3VudD0wOyBsZWZ0KG5sKTsgCiAgICAgICAgcHJpbnRmKCJjb3VudD0lZFxuIixjb3VudCk7CiAgICB9Cn07CgppbnQgbWFpbihpbnQgYXJnYyxjaGFyKiogYXJndikgewogICAgZW51bSB7IGxpbWl0PTEyOCB9OwogICAgaW50IExbbGltaXRdLFJbbGltaXRdOwogICAgY29uc3QgY2hhciogbGlzdFtdPXsKICAgICAgICAvLyIoYSkoKSkoKSkpKChiKGIpIiwKICAgICAgICAiKCkoKCkpKCgpKCkpKCgpKSgoKCkpKCkpKSkpKSkoKSkpKSkoKCgoKCgpKCgoKCgoKSkoKCkoKSkoKCgpKSgoKSgpKSkiLAogICAgICAgIGFyZ2M+MSA/IGFyZ3ZbMV0gOiAwLAogICAgICAgIDAKICAgIH07CiAgICBmb3IoY29uc3QgY2hhcioqIHM9bGlzdDsqcztzKyspIHsKICAgICAgICBDaGVjayBjOyBjLkw9TDsgYy5SPVI7IGMubGltPWxpbWl0OyBjLnRleHQ9KnM7CiAgICAgICAgdHJ5IHsgCiAgICAgICAgICAgIGlmIChjLmNoZWNrKCkpIGMuc2hvd192YXJpYW50cygpOwogICAgICAgIH0gY2F0Y2goQ2hlY2sqKSB7CiAgICAgICAgICAgIHByaW50ZigibGltaXQgZXhjZWVkZWQgLSAlc1xuIiwqcyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCg==