提交的地方
A
不是我的锅。。。
B
送分题
C
写法一:我也不知道哪里错了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 300;
int n,len,t,a,rt;
char c[N],tmp[5]={'{','[','(','<'},tr[5]={'}',']',')','>'};
bool flag,book[N];
inline int read()
{
char c=getchar();
int ans=0,w=1;
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') { w=-1; c=getchar(); }
while(c>='0'&&c<='9')
{ ans=ans*10+c-'0'; c=getchar(); }
return ans*w;
}
/*void work(int l,int r)
{
if(flag) return ;
if(l+1==r) return ;
int tt=l+1,aa=-1,rr=-1;
while(tt<r)
{
for(int i=0;i<4;i++)
if(c[tt]==tmp[i]) aa=i;
if(aa<0) { flag=1; printf("NO\n"); return ;}
for(int i=tt+1;i<r;i++)
{
if(c[i]==tr[aa]) { rr=i; break; }
for(int j=0;j<4;j++)
if((c[i]==tr[j]||c[i]==tmp[j])&&j<aa)
break;
}
if(rr<0) { flag=1; printf("%d****%d\n*NO\n",l,r); return ;}
work(tt,rr);
tt=rr+1;
}
}*/
int main()
{
n=read();
while(n--)
{
flag=0;
memset(book,0,sizeof(book));
cin>>c;
len=0; t=0; rt=-1;
while(c[len]) ++len;
for(int i=0;i<len;i++)
{
a=-1;
for(int j=0;j<4;j++)
if(c[i]==tr[j]) a=j;
if(a<0) continue;
for(int j=i-1;j>=0;j--)
{
if(j<0) break;
for(int k=0;k<4;k++)
if((c[j]==tr[k]||c[j]==tmp[k])&&k<a)
{ break; }
if(c[j]==tmp[a]&&!book[j]) { book[j]=1; book[i]=1; break; }
}
if(!book[i]) { flag=1;break;}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}
写法二:将所有的左括号放到一个栈里,每一个左括号进栈的时候,判断一下栈顶括号的下标是否大于当前括号(只判断相邻两个就行,不知道为啥从头判断会出错),满足条件才进栈,否则就是\(NO\)。如果当前是右括号,如果它和栈顶的括号不匹配,或者栈为空,就是\(NO\),如果合法,栈顶元素退栈。
错点:\(1.\)不要只把\(top\)清零,\(st\)数组也清一下,可能有想不到的地方会出错。
\(2.\)如果到最后栈中还有元素的话,也是不合法的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
int n,st[300],top,len,maxx,a;
char s[300],tr[5]={'1','{','[','(','<'};
char tm[5]={'1','}',']',')','>'};
map<char,int>mp;
bool flag;
int main()
{
// mp['{']=1; mp['[']=2; mp['(']=3; mp['<']=4;
scanf("%d",&n);
while(n--)
{
flag=0;
memset(st,0,sizeof(st));
cin>>s; len=0; maxx=0; top=0;
while(s[len]) ++len;
for(int i=0;i<len;i++)
{
a=-1;
if(flag) break;
// for(int j=1;j<=top;j++)
// {
// if(st[j]<maxx) { flag=1; break;}
// maxx=max(maxx,st[j]);
// }
if(flag) break;
char t=s[i];
for(int j=1;j<=4;j++)
if(t==tr[j]) { a=j; }
if(a>0)
{
if(st[top]<=a) st[++top]=a;
else { flag=1; break; }
}
else
{
if(tm[st[top]]!=t||top<=0)
{ flag=1; }
--top;
}
}
if(flag||top) printf("NO\n");
else printf("YES\n");
}
return 0;
}
D
找规律题,当时着急随便找了找竟然对了。打表是个好东西!
E
之前自己推出来过归并排序之前的预处理,这次大意了,因为样例是有序的,被骗了,少排了一次序。(归并也写错了。。)
归并漏掉了:
预处理的错误: