題目鏈接:http://poj.org/problem?id=2752點擊打開鏈接
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 21804 | Accepted: 11407 |
Description
Step1. Connect the father's name and the mother's name, to a new string S.
Step2. Find a proper prefix-suffix string of S (which is not only the prefix, but also the suffix of S).
Example: Father='ala', Mother='la', we have S = 'ala'+'la' = 'alala'. Potential prefix-suffix strings of S are {'a', 'ala', 'alala'}. Given the string S, could you help the little cat to write a program to calculate the length of possible prefix-suffix strings of S? (He might thank you by giving your baby a name:)
Input
Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000.
Output
Sample Input
ababcababababcabab aaaaa
Sample Output
2 4 9 18 1 2 3 4 5
求前後綴相同即是next數組的運用
從最後一位的next不斷枚舉
只要next【i】不爲0即說明存在這種情況
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
char t[1111111];
int n,m;
int nnext[1111111];
void getnext()
{
int i=0,j=-1;
nnext[0]=-1;
while(i<n)
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
nnext[i]=j;
}
else
{
j=nnext[j];
}
}
}
int main()
{
while(scanf("%s",&t)!=EOF)
{
n=strlen(t);
getnext();
vector<int > s;
s.push_back(n);
int mid=nnext[n];
while(mid!=0)
{
s.push_back(mid);
mid=nnext[mid];
}
reverse(s.begin(),s.end());
for(int i=0;i<s.size();i++)
{
printf("%d ",s[i]);
}printf("\n");
}
}