题目描述
Recently, the cows have been competing with strings of balanced parentheses and comparing them with each other to see who has the best one.
Such strings are scored as follows (all strings are balanced): the string '()' has score 1; if 'A' has score s(A) then '(A)' has score 2*s(A); and if 'A' and 'B' have scores s(A) and s(B), respectively, then 'AB' has score s(A)+s(B). For example, s('(())()') = s('(())')+s('()') = 2*s('()')+1 = 2*1+1 = 3.
Bessie wants to beat all of her fellow cows, so she needs to calculate the score of some strings. Given a string of balanced parentheses of length N (2 <= N <= 100,000), help Bessie compute its score.
给定一个只包含左右括号的字符串,得分规则如下:
如果一对括号内没有括号,那么这对括号的得分为1;如果两对括号互不包含(即并列存在),那这两对括号的得分相加;如果括号内包含一对括号,那么这个括号的得分纪为内部括号序列的得分*2。
例如:对于这样一个字符串:"() ()",两对括号并列存在,则得分为1+1=2;
而对于这样一个字符串:"(())",最外层的括号内层包含一对括号,则得分为2*1=2.
Bessie想击败所有同事的牛,所以她需要计算某个字符串的评分。给定一个长度为n、只包含括号的字符串(2≤N≤100000),计算其得分帮助Bessie。
输入格式
* Line 1: A single integer: N
* Lines 2..N + 1: Line i+1 will contain 1 integer: 0 if the ith character of the string is '(', and 1 if the ith character of the string is ')'
输出格式
* Line 1: The score of the string. Since this number can get quite large, output the score modulo 12345678910.
输入输出样例
6 0 0 1 1 0 1
3
说明/提示
This corresponds to the string "(())()".
As discussed above.
输出答案要mod12345678910
思路
存储两个合法括号序列间有多少对括号计算即可。
能 % 就 %, 真就wa穿嗷。
另外题意解释的不是很清楚,给一组数据帮助理解下
14
0 0 0 1 1 1 0 0 0 1 1 0 1 1
输出应该是 4 + 2 * ( 2 + 1 ) = 10
CODE
1 #include <bits/stdc++.h> 2 #define dbg(x) cout << #x << "=" << x << endl 3 #define eps 1e-8 4 #define pi acos(-1.0) 5 6 using namespace std; 7 typedef long long LL; 8 9 const int inf = 0x3f3f3f3f; 10 11 template<class T>inline void read(T &res) 12 { 13 char c;T flag=1; 14 while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0'; 15 while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag; 16 } 17 18 namespace _buff { 19 const size_t BUFF = 1 << 19; 20 char ibuf[BUFF], *ib = ibuf, *ie = ibuf; 21 char getc() { 22 if (ib == ie) { 23 ib = ibuf; 24 ie = ibuf + fread(ibuf, 1, BUFF, stdin); 25 } 26 return ib == ie ? -1 : *ib++; 27 } 28 } 29 30 int qread() { 31 using namespace _buff; 32 int ret = 0; 33 bool pos = true; 34 char c = getc(); 35 for (; (c < '0' || c > '9') && c != '-'; c = getc()) { 36 assert(~c); 37 } 38 if (c == '-') { 39 pos = false; 40 c = getc(); 41 } 42 for (; c >= '0' && c <= '9'; c = getc()) { 43 ret = (ret << 3) + (ret << 1) + (c ^ 48); 44 } 45 return pos ? ret : -ret; 46 } 47 48 const LL MOD = 12345678910; 49 50 int n; 51 52 int a[1000007]; 53 54 int main() 55 { 56 //freopen("data.txt", "r", stdin); 57 scanf("%d",&n); 58 LL ans = 0; 59 LL sum = 0, cnt = 0; 60 for ( int i = 1; i <= n; ++i ) { 61 scanf("%d",&a[i]); 62 } 63 for ( int i = 1; i <= n; ++i ) { 64 if(a[i] == 0) { 65 cnt++; 66 } 67 else { 68 cnt--; 69 //dbg(cnt); 70 if(!a[i-1]) { 71 LL temp = 1; 72 for ( int j = 1; j <= cnt; ++j ) { 73 temp *= 2; 74 temp %= MOD; 75 } 76 sum += temp; 77 sum %= MOD; 78 //dbg(sum); 79 } 80 } 81 } 82 cout << sum % MOD << endl; 83 return 0; 84 }