HDU-2572 终曲(水题)

版权声明:IT交流QQ群328880248,欢迎大家来一起学习一起交流~本篇文章未经同意请勿转载! https://blog.csdn.net/m0_38072683/article/details/87473210

终曲

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)

Total Submission(s) : 22   Accepted Submission(s) : 6

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

最后的挑战终于到了!
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。

Input

输入数据首先是一个整数C,表示测试数据有C组;
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10

Output

请对应每组输入数据输出满足条件的最短子串;
如果没有,请输出 No

Sample Input

2
abcd
ab
bc
abc
ab
bd

Sample Output

abc
No

思路

一道水题给我搞自闭了,自闭了。

第一次提交了 直接就WA了,哎,我还一直以为是我的程序逻辑问题,后来才发现是我的数组开的小了。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int MAXN = 100 + 10;
const int MINN = 10 + 2;
char a[MAXN],b[MINN],c[MINN],t[MAXN*2],res[MAXN*2];

int main() {
	int n;
	scanf("%d", &n);
	while(n--){
		scanf("%s", a);
		scanf("%s", b);
		scanf("%s", c);
		int len_a = strlen(a);
		int len_b = strlen(b);
		int len_c = strlen(c);
		
		int min1 = max(len_b, len_c);		
		int min_len = 10000;
		
		for (int i = 0; i < len_a; i++) {
			for(int j = i + min1 - 1; j < len_a; j++) {
				for (int k = i; k <= j; k++) {
					t[k-i] = a[k];
				}
				t[j-i+1] = '\0';
				int len = strlen(t);
				if (strstr(t, b) && strstr(t, c)) {
					if (min_len > len) {
						strcpy(res, t);
						min_len = len;
					} else if(min_len == len) {
						if (strcmp(res, t) > 0) {
							strcpy(res, t);
						}
					} 
				}
			}
		}
		if (min_len == 10000) {
			printf("No\n");
		} else {
			printf("%s\n", res);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_38072683/article/details/87473210