题目链接:http://poj.org/problem?id=2752
题意:求即是前缀有是后缀的子串有几个,输出长度。
思路:考察next数组的性质。具体见代码。
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#include <algorithm>
#include <vector>
#include <string.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <sstream>
#include <time.h>
using namespace std;
void get_next(char x[], int m, int Next[])
{
int i, j;
j = Next[0] = -1;
i = 0;
while (i < m)
{
while (-1 != j && x[i] != x[j]) j = Next[j];
Next[++i] = ++j;
}
}
int Next[1001000];
char a[1000100];
int ans[1000010];
int main()
{
int t, num;
while (scanf("%s", a) != EOF)
{
num = 0;
int n = strlen(a);
ans[num++] = n;
get_next(a, n, Next);
int t = Next[n - 1];
while (t != -1)
{
if (a[t] == a[n - 1]) ans[num++] = t+1;
t = Next[t];
}
for (int i = num - 1; i >= 0; i--)
{
printf("%d",ans[i]);
if (i != 0) printf(" ");
else printf("\n");
}
}
return 0;
}