首页 > 代码库 > POJ 2752 Seek the Name, Seek the Fame
POJ 2752 Seek the Name, Seek the Fame
题目大意:给你一个字符串,让你找出这个字符串中有多少满足下列条件的字串:该字串既是母串的前缀,也是字串的后缀。
解题思路:此题着重考察对KMP 算法中的Next 数组的理解。
代码如下:
#include<cstdio> #include<string> #include<algorithm> #include<cstring> #include<cstdlib> #include<iostream> using namespace std ; const int MAXN = 400005 ; char s[MAXN] ; int len ; int Next[MAXN] ; int ans[MAXN] ; void init() { memset(Next , 0 , sizeof(Next)) ; memset(ans , 0 , sizeof(ans)) ; } void getNext(char *s) { int i = 0 ; len = strlen(s) ; Next[0] = -1 ; int j = -1 ; while (i < len) { if(j == -1 || s[i] == s[j]) { j ++ ; i ++ ; Next[i] = j ; } else j = Next[j] ; } } void solve() { getNext(s) ; int cnt = 0 ; int k = Next[len - 1] ; ans[cnt ++] = len ; while(k != -1) { if(s[k] == s[len - 1]) { ans[cnt ++] = k + 1 ; } k = Next[k] ; } int i ; for(i = cnt - 1 ; i >= 0 ; i --) { printf("%d" , ans[i]) ; if(i >= 1) printf(" ") ; } printf("\n") ; } int main() { while (scanf("%s" , s) != EOF) { init() ; solve() ; } return 0 ; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。