传送门:题目
题解:
纯KMP,考的就是KMP中next数组的具体含义。
如果不理解next,可以参考这篇博客:KMP中next数组含义
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 400010;
int KMP_next[maxn];
void kmp_pre(char x[], int m, int KMP_next[]) {//kmp未优化版
int i = 0, j = KMP_next[0] = -1;
while (i < m) {
while (j != -1 && x[i] != x[j])
j = KMP_next[j];
KMP_next[++i] = ++j;
}
}
int main(void) {
char s[maxn];
int ans[maxn];
int len, temp, cnt;
while (cin >> s) {
len = strlen(s);
cnt=0;
kmp_pre(s, len, KMP_next);
temp = KMP_next[len - 1];
while (temp != -1) {
if (s[temp] == s[len - 1])
ans[cnt++] = temp + 1;
temp = KMP_next[temp];
}
for (int i = cnt - 1; i >= 0; i--)
cout << ans[i] << " ";
cout << len << endl;
}
return 0;
}