括号串
示例1:
1
7 10
())[]](
()()[][]()
输出:
Accepted
示例2:
2
7 10
())[]](
()[][]()()
7 10
())[]](
[(())[]]()
输出:
Wrong Answer
Accepted
参考代码:
#include <bits/stdc++.h>
int n,m;
char s[1000001],t[1000001];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);scanf("%s",s+1);scanf("%s",t+1);
int g=1,x=0,y=0,p=1;
bool ff=1;
for(int i=1;i<=m;i++)
{
if(t[i]=='(')x++;
if(t[i]==')'){if((--x)<0){ff=0;break;}}
if(t[i]=='[')y++;
if(t[i]==']'){if((--y)<0){ff=0;break;}}
if(t[i]==s[p])p++;
}
if(ff&&p>n&&!x&&!y)puts("Accepted");
else puts("Wrong Answer");
}
return 0;
}
虎龙斗
示例1
输入
3 2 4
1 1 2
2 3
输出
3 1 1 2
示例2
输入
10 10 7
7 3 8 2 8 1 3 4 6 5
8 3 4 5 3 8 3 5 10 3
输出
10 8 8 4 6 5 3
参考代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1010;
int n,m,l;
int a[maxn],b[maxn];
int ra[maxn],rb[maxn];
int q[maxn],k;
int res[maxn];
int f1[maxn],f2[maxn],n1,n2;
int f[maxn],len;
void con(){
int p1=1,p2=1;
while(p1<=n1&&p2<=n2){
if(f1[p1]>f2[p2]) f[++len]=f1[p1++];
else if(f1[p1]<f2[p2]) f[++len]=f2[p2++];
else{
int x=p1,y=p2;
while(x<=n1&&y<=n2&&f1[x]==f2[y]) x++,y++;
if(x>n1) f[++len]=f2[p2++];
else if(y>n2) f[++len]=f1[p1++];
else{
if(f1[x]>f2[y]) f[++len]=f1[p1++];
else f[++len]=f2[p2++];
}
}
}
while(p1<=n1) f[++len]=f1[p1++];
while(p2<=n2) f[++len]=f2[p2++];
}
void solve(int x){
int y=l-x;
if(y<0||y>m) return;
n1=n2=len=0;
for(int i=1;i<=n&&n1<x;i++){
if(!ra[i]||n1+n-ra[i]+1<x)
f1[++n1]=a[i];
}
for(int i=1;i<=m&&n2<y;i++){
if(!rb[i]||n2+m-rb[i]+1<y)
f2[++n2]=b[i];
}
con();
for(int i=1;i<=len;i++)
if(res[i]!=f[i]){
if(res[i]<f[i]) memcpy(res,f,sizeof(f));
return;
}
}
int main(){
scanf("%d%d%d",&n,&m,&l);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
k=0;
for(int i=1;i<=n;i++){
while(k&&a[q[k-1]]<a[i]){
ra[q[k-1]]=i;
k--;
}
q[k++]=i;
}
k=0;
for(int i=1;i<=m;i++){
while(k&&b[q[k-1]]<b[i]){
rb[q[k-1]]=i;
k--;
}
q[k++]=i;
}
for(int i=0;i<=n;i++) solve(i);
for(int i=1;i<=l;i++)
printf("%d ",res[i]);
}