Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 17898 | Accepted: 9197 |
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
Source
题意:给定字符串S,问所有满足既是S的前缀,又是S的后缀的子串的长度
若将i的父结点设为f[i],那么会形成一棵树。
对于i的祖先j,一定满足S[1,j]=S[i-j+1,i]。并且满足S[1,j]=S[i-j+1,i]的j,一定是i的祖先。
本题求的就是S的所有祖先的长度。
也就是说,它的失配函数的相同前后缀一定也是它的相同前后缀(相同前后缀的相同前后缀)
注意|S|一定成立
又犯了数组大小的沙茶错误
//
// main.cpp
// poj3461
//
// Created by Candy on 10/19/16.
// Copyright ? 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=4e5+;
int f[N],n;
char s[N];
void getFail(){
f[]=;
for(int i=;i<=n;i++){
int j=f[i-];
while(j&&s[i]!=s[j+]) j=f[j];
f[i]=s[i]==s[j+]?j+:;
}
}
int ans[N],m=;
void sol(){
m=;
getFail();
int j=f[n];
while(j){ans[++m]=j;j=f[j];}
for(int i=m;i>=;i--) printf("%d ",ans[i]);
printf("%d\n",n);
}
int main(){
//freopen("in.txt","r",stdin);
while(scanf("%s",s+)!=EOF){
n=strlen(s+);
sol();
}
return ;
}