洛谷: P1470 [USACO2.3] 最长前缀 Longest Prefix

该篇文章介绍了如何结合KMP算法、暴力搜索以及剪枝策略,使用深度优先搜索(DFS)解决字符串查找问题,避免重复计算,提高效率。
摘要由CSDN通过智能技术生成

思路: 拒绝KMP,map+暴力+剪枝。

DFS(pos)表示检索到了s的pos位,枚举下一个位置,len从pos开始能截取的长度。

vis[pos]是否检索过这个位置,如果来过了,那就直接返回就好了,不要再重复的去枚举了。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
map<string, bool> mp;
string s;
int maxs,vis[maxn];
void DFS(int pos) {//pos开始
	if (vis[pos] == 0) {
		vis[pos] = 1;
		for (int len = 1; len <= 10 && pos + len <= s.size(); len++) {
			string str = s.substr(pos, len);
			if (mp[str]) {
				maxs = max(pos + len, maxs);
				DFS(pos + len);
			}
		}
	}
}
int main() {
	string tmp;
	while (cin >> tmp) {
		if (tmp == ".") break;
		mp[tmp]++;
	}
	while (cin >> tmp) {
		s += tmp;
	}
	DFS(0);
	cout << maxs << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值