题解————USACO最好的括号
题目翻译不完全,这是许多国外oj拿过来的题的通病,所以我来补充翻译一下
输入格式:
第一行,n;
接下来n行,每行0或1,0对应“(”;1对应“)”
输出格式
得分对12345678910取模的结果
然后再用一个式子简单推一下样例
s('(())()')=s('(())')+s('()'=2*s('()'+1=2*1+1=3。
英文渣渣,翻译的不好请见谅。
别的东西题目上说的已经很清楚了;
接下来是做题的思路->
我们可以用定义一个整型变量tops来模拟栈顶指针。
当输入为‘(’入栈,tops++;
当输入为“)”出栈,tops--;
若这一位是‘)’但上一位是‘(’进行x_mod,即计算2^tops次方,并累加入tot;
最后输出tot值即可。
需要注意的是:
1.取模的12345678910会爆int,所以开long long。
2.注意每一步都取模,别因为少%而丢失部分分
最后,上代码,自以为还是蛮简洁易懂的。
#include<bits/stdc++.h>
#define p 345345
#define h 5001
#define fint register int
#define int long long
#define mods 12345678910
using namespace std;
int a[p],tops,tot;
inline int read();
inline int x_mod(int x,int y);
signed main()
{
int n;
n=read();
for(fint i=1;i<=n;i++)
a[i]=read();
for(fint i=1;i<=n;i++)
if(a[i]==0)
tops++;
else
{
tops--;
if(a[i-1]==0)
tot+=x_mod(1,tops),tot%=mods;
}
cout<<tot%mods;
return 0;
}
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline int x_mod(int x,int y)
{
for(fint i=1;i<=y;i++)
x*=2,x%=mods;
return x;
}
总体来说这道题主要还是模拟,只要理解题意难度还是不大的。祝大家AC!