博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2752 Seek the Name, Seek the Fame [kmp]
阅读量:5244 次
发布时间:2019-06-14

本文共 2386 字,大约阅读时间需要 7 分钟。

Seek the Name, Seek the Fame
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 17898   Accepted: 9197

Description

The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. They seek the name, and at the same time seek the fame. In order to escape from such boring job, the innovative little cat works out an easy but fantastic algorithm: 
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

The input contains a number of test cases. Each test case occupies a single line that contains the string S described above. 
Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000. 

Output

For each test case, output a single line with integer numbers in increasing order, denoting the possible length of the new baby's name.

Sample Input

ababcababababcababaaaaa

Sample Output

2 4 9 181 2 3 4 5

Source

,Zeyuan Zhu

题意:给定字符串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 
#include
#include
#include
using namespace std;const int N=4e5+5;int f[N],n;char s[N];void getFail(){ f[1]=0; for(int i=2;i<=n;i++){ int j=f[i-1]; while(j&&s[i]!=s[j+1]) j=f[j]; f[i]=s[i]==s[j+1]?j+1:0; }}int ans[N],m=0;void sol(){ m=0; getFail(); int j=f[n]; while(j){ans[++m]=j;j=f[j];} for(int i=m;i>=1;i--) printf("%d ",ans[i]); printf("%d\n",n);}int main(){ //freopen("in.txt","r",stdin); while(scanf("%s",s+1)!=EOF){ n=strlen(s+1); sol(); } return 0;}

 

 
 
 

转载于:https://www.cnblogs.com/candy99/p/6219056.html

你可能感兴趣的文章
TP5(1)虚拟域名
查看>>
c++ map multimap操作
查看>>
C++ Run-Time Libraries
查看>>
css中可以和不可以继承的属性
查看>>
函数使用一:采购订单BAPI_PO_CREATE1
查看>>
使用python读取txt坐标文件生成挖空矿山_采矿批量
查看>>
学习记录
查看>>
SQL SERVER占用CPU过高优化S
查看>>
小程序UI
查看>>
设计模式(迭代器模式)
查看>>
打印自定义纸张大小
查看>>
新装系统5ucms进后台报错-数据库链接出错,请检查数据库路径是否正确(Inc/Conn.asp)!解决办法...
查看>>
WebView Html Play Audio
查看>>
职场险恶
查看>>
Java多线程之新类库中的构件PriorityBlockingQueue
查看>>
Jquery操作复选框(CheckBox)的取值赋值实现代码
查看>>
Java IO流 之 File 键盘命令行实例
查看>>
spring mvc 默认页面
查看>>
Java基础—基础语法与常用命令
查看>>
UltraEdit v17.00.0.1041简体中文版注册破解激活图文详解
查看>>