SGU 179 解题手记
可以模拟,从后往前找第一个可以变成")"的"(",可以改变的"("要满足他的前面"("个数多于")"的条件。把这个位置改变一下,然后在他之后填充"(……()……)",这样形成的序列就是所求了。如果找不到可改变的"(",就no solution。
Submit 1: RTE on 2。在被改变的位置之后填充的"("的个数计算错了,这会造成WA。程序的结构有所变化。找了一个大数据,居然真挂了:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
忽略 (core dumped)
再次测试,居然不挂了……真诡异。
Submit 2: AC。……厄……我做什么了?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | //AC #include <iostream> #include <string> using namespace std; string seq; int forw[10000],leftb[10000],rightb[10000]; int main() { cin>>seq; unsigned i(1); for (;i<seq.size();++i) { forw[i]=(seq[i-1]=='(' ? i-1 : forw[i-1]); leftb[i]=leftb[i-1]; rightb[i]=rightb[i-1]; ++(seq[i-1]=='(' ? leftb[i] : rightb[i]); } --i; while (i) if (seq[i]=='(' && leftb[i]>rightb[i]) { int k=seq.size()/2-leftb[i]; cout<<string(seq,0,i)<<')'<<string(k,'(')<<string(seq.size()/2-rightb[i]-1,')')<<endl; return 0; } else i=forw[i]; cout<<"No solution"<<endl; return 0; } |
