Seek the Name, Seek the Fame - POJ 2752 - Virtual Judge
知道KMP算法的都知道其中有个很神奇的next数组,其中next数组就是来记录当前字符以前的字符串中 最长的 前缀等于后缀的 串 的长度,正好符合题意,这个题这个串的本身其实也是前缀等于后缀,不能忘了,这里next的优化不能用,还是得理解优化的使用范围,是为了匹配更快,避免重复的递归调用,而这里需要的是前缀和后缀相等的字符串的长度,正好与优化前的next数组对应上了
AC代码:
#include <iostream> #include <string> #include <cstring> #include <vector> #include <set> #include <cmath> #include <algorithm> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); string s; while (cin >> s) { int len = s.size(); vector<int> next(len + 1); next[0] = -1; int j = 0, k = -1; while (j < len) { if (k == -1 || s[j] == s[k]) { j++; k++; next[j] = k; } else { k = next[k]; } } vector<int> ans(len + 1); int cnt = 0; int t = next[len - 1]; while (t != -1) { if (s[t] == s[len - 1]) ans[cnt++] = t + 1; t = next[t]; } for (int i = cnt - 1; i >= 0; i--) { cout << ans[i] << " "; } cout << len << "\n"; } return 0; }
POJ2752(KMP的next数组的理解应用)
于 2022-04-04 20:50:21 首次发布
博客探讨了KMP算法中的next数组概念,强调其在记录字符串最长前缀等于后缀长度中的作用。AC代码展示了如何利用next数组解决特定问题,着重指出next数组优化的目的并非适用于所有情况,而是在于提高匹配效率。
摘要由CSDN通过智能技术生成