0分求调
查看原帖
0分求调
312614
D_King楼主2023/10/13 21:02
#include<iostream>
#include<math.h>
using namespace std;
int ans = -1, n, maxn = -1, p = -1;
struct node {
	int time=0;//被访问次数
	string word;
}; node words[21];
int find(node x, node y) {
	for (int i = x.word.size() - 1; i >= 0; i--) {
		if (x.word[i] == y.word[0]) {
			int k = 0;
			for (int j = i + 1; j <= x.word.size() - 1; j++) {
				k++;
				if (k >= y.word.size()) {
					return 0;
				}
				if (x.word[j] != y.word[k]) {
					return 0;
				}
			}
			return y.word.size() - (k + 1);
		}
	}
	return 0;
}
void dfs(node a) {
	for (int i = 1; i <= n; i++) {
		if (a.time < 2) {
			if (words[i].word != a.word) {
				if (find(a, words[i])) {
					a.time++;
					ans += find(a, words[i]);
					dfs(words[i]);
					a.time--;
					ans -= find(a, words[i]);
				}
			}
		}
	}
	p = max(p, ans);
}
int main() {
	char head;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> words[i].word;
	}
	cin >> head;
	for (int i = 1; i <= n; i++) {
		if (words[i].word[0] == head) {//扫一遍有没有符合题意的
			ans += words[i].word.size();
			words[i].time++;
			dfs(words[i]);
			words[i].time--;
			maxn = max(p, maxn);
		}
	}
	cout << maxn;
	return 0;
}
//每个点最多访问两次
//从head开始,逐次访问并记录每个点访问次数,最后记录长度,与最长长度比较
//枚举两个单词能不能拼在一起,并且拼在一起的长度最短(暴力枚举)

按照这篇题解的思路写的,就是找不到问题在哪,Visual Studio提示是爆栈了

0x00007FFCEFF2CFF5 (ntdll.dll) (p1019.exe 中)处有未经处理的异常: 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000660F403FF8)。

2023/10/13 21:02
加载中...