求偏序集中的极大元与极小元

输入

输入偏序集£>A中的元素数不超过20个,分别用单个小写的英文字母表示。

输入的第一行给出A中的各个元素,两个相邻的元素之间用逗号隔开。

输入的第二行给出偏序关系£,用有序对的形式给出(只给出哈斯图中的满足覆盖的两个元素形成的有序对),如,等等,两个相邻的有序对之间用逗号隔开。

输出

输出A的极小元与极大元。

输出的第一行给出各个极小元,两个相邻元素之间用逗号隔开,输出的元素要求按照英文字母的自然顺序排列输出。

输出的第二行给出各个极大元,两个相邻元素之间用逗号隔开,输出的元素要求按照英文字母的自然顺序排列输出。


样例输入

a,b,c,d

,

样例输出

a,c

b,d


#include
#include
#include
#define maxn 1000
#define maxm 10
using namespace std;
char s[maxn];  //储存字符
char re[maxn]; //存储关系
char pos[maxm];
int cnt[27][2];  //标记字母再偏序关系中的位置
char maxs[27]; //存储极大元
char mins[27]; //存储极大元
void setcnt() {  
	cnt[pos[1] - 'a'][0] = 1;
	cnt[pos[3] - 'a'][1] = 1;
}
void setoutput() {
	int l = strlen(s);
	int i1 = 0,i2 = 0;
	for (int i = 0;i < l;i++) {
		if (s[i] >= 'a'&&s[i] <= 'z') {
			if (cnt[s[i] - 'a'][0] == 1 && cnt[s[i] - 'a'][1] == 0) mins[i1++] = s[i];
			if (cnt[s[i] - 'a'][0] == 0 && cnt[s[i] - 'a'][1] == 0) {
				mins[i1++] = s[i];
				maxs[i2++] = s[i];
			}
			if (cnt[s[i] - 'a'][0] == 0 && cnt[s[i] - 'a'][1] == 1) maxs[i2++] = s[i];
		}
	}
}
void output1() {
	int l = strlen(mins);
	for (int i = 0;i < l - 1;i++) printf("%c,", mins[i]);
	printf("%c\n", mins[l - 1]);
}
void output2() {
	int l = strlen(maxs);
	for (int i = 0;i < l - 1;i++) printf("%c,", maxs[i]);
	printf("%c\n", maxs[l - 1]);
}
int main() {
	for (int i = 0;i < 27;i++) {
		cnt[i][0] = 0;
		cnt[i][1] = 0;
	}  //对cnt数组初始化
	scanf("%s", s);
	scanf("%s", re);
	int l = strlen(re);
	int post;
	for (int i = 0;i < l;i++) {   //分别对每一对偏序关系进行处理
		if (re[i] == '<') {
			post = 0;
			pos[post++] = re[i];
		}
		else if ((re[i] >= 'a'&&re[i] <= 'z')||(re[i]==','&&re[i-1]!='<')) {
			pos[post++] = re[i];
		}
		else if (re[i] == '>') {
			pos[post] = re[i];
			post = 0;
			setcnt();
		}
	}
	setoutput();  //将结果保存
	output1();   
	output2();
	return 0;
}


你可能感兴趣的:(离散数学)