洛谷: 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;
}