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

思路: 拒绝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;
}

posted @ 2024-03-03 11:22  YuKiCheng  阅读(22)  评论(0编辑  收藏  举报  来源