Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 14875 | Accepted: 7471 |
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
這個題目問的是保證前綴和後綴相同的情況下,求解這個前綴或後綴的長度。
KMP的next值不就是該位前面的字符串中前綴後綴長度相同的位數麼。
我們只需要從最後面第len(len爲字符串長度)開始找,找到一個前綴和後綴長度後,跳到前綴的後一個,繼續把前綴作爲處理的字符串繼續找。直到最後到0.代碼如下:
/*************************************************************************
> File Name: Seek_the_Name.cpp
> Author: Zhanghaoran
> Mail: [email protected]
> Created Time: Thu 26 Nov 2015 05:00:27 PM CST
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
void prekmp(char x[], int m, int nextKmp[]){
int i, j;
i = 0;
j = nextKmp[0] = -1;
while(i < m){
if(j == -1 || x[i] == x[j])
nextKmp[++ i] = ++ j;
else
j = nextKmp[j];
}
//for(int i = 0; i <= m; i ++)
// cout << nextKmp[i] << " ";
//cout << endl;
}
int nexti[1000010];
char a[1000010];
int temp[1000010];
int main(void){
while(~scanf("%s", a)){
int ans = 0;
int len = strlen(a);
prekmp(a, len, nexti);
int p = len;
temp[ans ++] = len;
while(nexti[p]){
p = nexti[p];
temp[ans ++] = p;
}
for(int i = ans - 1; i >= 0; i --)
cout << temp[i] << " ";
cout << endl;
}
}