编程题共两道:
1.并查集问题
#include <cstdio>
#define MAXN 1111
int par[MAXN];
void build(int l,int r)
{
for(int i=l;i<=r;++i)
par[i]=i;
}
int find(int x)
{
int i,j,k;
i=j=x;
while(par[i]!=i)
i=par[i];
while(j!=i)
{
k=par[j];
par[j]=i;
j=k;
}
return i;
}
bool same(int x,int y)
{
x=find(x);
y=find(y);
return x==y;
}
void join(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
par[x]=y;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if (n==0 && m==0)
{
break;
}
build(1,n);
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
if (!same(a,b))
{
join(a,b);
}
}
int ans = -1;
int root = find(1);
for (int i = 1; i <= n; ++i)
{
if (find(i) == root)
{
++ans;
}
}
printf("%d\n", ans);
}
return 0;
}
2.字符串的处理
#include <cstdio>
const int MAXN = 111;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
char str[MAXN];
char ans[MAXN];
int len = 0;
scanf("%s",str);
for (int i = 0; str[i] != '\0'; ++i)
{
if (str[i] == '#') {
len --;
if (len < 0) len = 0;
} else if (str[i] == '@') {
len = 0;
} else {
ans[len++] = str[i];
}
}
ans[len] = '\0';
printf("%s\n", ans);
}
return 0;
}