題目大意:給你一個字符串,讓你找出這個字符串中有多少滿足下列條件的字串:該字串既是母串的前綴,也是字串的後綴。
解題思路:此題著重考察對KMP 算法中的Next 數組的理解。
代碼如下:
#include#include #include #include #include #include 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 ; }