1.qiqi
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[1000005];
char stack[1000005];
int top; //栈的标示
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
while(cin>>a){
top = -1;
for(int i = 0; i < (int)strlen(a); i++){
if(a[i] == '[' || a[i] == '(')
stack[++top] = a[i];
else if((a[i] == ']' && stack[top] == '[')
||(a[i] == ')' && stack[top] == '('))
top--;
else{
cout<<"NO"<<endl;
top = -2; //给top赋予一个不可能的值,表示结果已经输出
break;
}
}
if(-1 == top) cout<<"YES"<<endl; //对应19行
memset(a, 0, sizeof(a));
}
return 0;
}
2.fangfang
(1)链表实现
#include <iostream>
using namespace std;
const int maxn = 1000010;
int f[maxn];
int N,M;
int find ( int x, int y )
{
int pt = f[x];
while ( pt != x ){
if ( pt == y ) return true;
else pt = f[pt];
}
return false;
}
void merge ( int x, int y )
{
int xx,yy;
xx = f[x];
yy = f[y];
f[x] = yy;
f[y] = xx;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
cin>>N>>M;
for ( int ii=1; ii<=N; ii++ )
f[ii] = ii;
for ( int ii=0; ii<M; ii++ ){
int t,x,y;
cin>>t>>x>>y;
if ( 1 == t ){
if ( !find ( x, y ) )
merge(x,y);
}else if ( 2 == t ) {
if ( find ( x, y ) ){
cout<<"yes"<<endl;
}else {
cout<<"no"<<endl;
}
}
}
return 0;
}
(2)并查集实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int maxN=1000010;
int f[maxN];
int N,M;
int find(int x)
{
if ( f[x] != x ){
f[x] = find(f[x]);
}
return f[x];
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d%d\n",&N,&M);
int t,a,b;
for ( int jj=1;jj<=N;jj++ ){f[jj]=jj;}
for ( int ii=1;ii<=M;ii++ ){
scanf("%d%d%d",&t,&a,&b);
if ( t == 1 ) {
find(a);find(b);
f[f[a]]=f[b];
}else if ( t == 2 ){
if ( find (a) == find (b) ){
printf("yes\n");
}else {
printf("no\n");
}
}
}
return 0;
}
3.xiaoxiao
#include <stdio.h>
const int maxN=1000010;
int N,M,K;
bool att[maxN];
int fr[maxN],ne[maxN];
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
cin>>N>>M;
for ( int ii=1;ii<=N;ii++ ){
fr[ii]=ii-1;
ne[ii]=ii+1;
att[ii]=1;
}
fr[1]=N;ne[N]=1;
int last=1;
for ( int ii=1;ii<=M;ii++ ){
cin>>K;
if ( att[K] == 0 ) {
cout<<"0"<<endl;
}else {
int pt = last;
int cnt = 1;
while ( pt != K ){
pt = ne[pt];
cnt ++;
}
int f = fr[pt];
int n = ne[pt];
ne[f] = n;
fr[n] = f;
att[K]=0;
last = ne[K];
cout<<cnt<<endl;
}
}
return 0;
}
-----阿伦