lqb省赛日志[15/37]

一只小蒟蒻备考蓝桥杯的日志

笔记

DFS的巨坑

void DFS(string now, int length) {
	max_length = max(max_length, length);
	for(int i = 0; i < N; i++) {
		if(used_cnt[i] >= 2) {
			continue;
		}
		
		int covered_length = covered(now, strings[i]);
		if(covered_length == -2 || covered_length == -1) {
			continue;
		}
		
		used_cnt[i]++;
		string now_ = now + strings[i].substr(covered_length, strings[i].length());
		int length_ = length + (strings[i].length() - covered_length);
		DFS(now_, length_); 
		//千万千万不能
		/*
		now += strings[i].substr(covered_length, strings[i].length());
		length += (strings[i].length() - covered_length);
		DFS(now, length);
		*/
		used_cnt[i]--;
	}
}

以及,之前DFS都有明确的退出条件,加在for循环前就可以及时退出了,这题没有,不影响,它正常退出就好

string 查找

参考 C++ string类的使用 (蓝桥杯比赛必备知识) 干货,太干了

str1.find(str2, pos)

从str1下标为pos的地方开始找str2,碰到的第一组的第一个字母下标返回
没找到返回 -1
没有pos,默认从头开始(index=0)

str1.rfind

从右往左找,我不确定它下标返回的是str2第一个还是最后一个下标
其余同find

str.substr(index1, index2)

返回 str [index1, index2) 的子串
勘误!!!第2个参数不是index下标,是length!!!
(2024年3月24日)

我保证之前肯定学过,就是忘记了…这次又学好久慢慢琢磨
这次的Demo

在两个单词相连时,其重合部分合为一部分
例如 beast 和 astonish,如果接成一条龙则变为 beastonish
另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。
int covered(string str1, string str2) {
	int re = -1;
	int length1 = str1.length();
	int length2 = str2.length();
	for(int i = min(length1, length2); i >= 1; i--){
		int begin_index = str1.find(str2.substr(0, i), length1 - i);
//		cout << length1 - i << " " << begin_index << endl;
		if(begin_index != -1) {
			if(i == length2) { //完全重叠
				re = -2;
			} else {
				re = i; //重叠长度
			}
			break;
		}
	}
//	substr(x1, x2) -> [x1, x2) index下标
//	find -> return 下标
	return re;
}

刷题

  1. P1019 [NOIP2000 提高组] 单词接龙

心得

  1. …这道题把我折磨得心力交瘁,最终没有ac,过了一半,太累了放一放
    DFS,我发现了一个从来没有犯过的错,记录如下
    DFS里有for循环,把所有数据过一边,挑其中可行的进下一轮DFS循环,以之前做的,都是mov型的,就是在xy坐标的基础上加个mov实现移动
    Attention!!!!
    是不是每次都重开一个x1 y1放到DFS里,而不是 x += mov,把x放到DFS里?
    为什么???!
    因为回溯的时候,x要再利用,本来应该是很好看出的,偏偏这次存的是string,我还debug半天为什么回溯string没有去掉后加的,因为for循环的初始string已经变动
    代码放在笔记里

    还漏考虑一个点…envelope拼两个不算完全重合…

小结

先发布,上课去了,晚点不确定有没有时间再写
这题真的磨我太久了,从字符到那个DFS坑…
“业精于勤荒于嬉,行成于思毁于随”
小蒟蒻一个月,冲省一!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值