原题面为英文,下面使用了 AI 翻译。
描述
这只小猫非常有名,许多夫妇不辞辛劳地跋山涉水来到比特兰,请小猫为他们新生的宝宝取名。他们既寻求名字,也追求名声。为了摆脱这种无聊的工作,这只富有创新精神的小猫想出了一个简单但巧妙的算法:
第一步:将父亲的名字和母亲的名字连接成一个新字符串S。 第二步:找出S的所有合适的前缀-后缀字符串(既是S的前缀又是S的后缀的字符串)。
示例:父亲='ala',母亲='la',我们得到S = 'ala'+'la' = 'alala'。S可能的前缀-后缀字符串有{'a', 'ala', 'alala'}。给定字符串S,你能帮小猫写一个程序计算S所有可能的前缀-后缀字符串的长度吗?(作为感谢,他可能会给你的宝宝取个名字哦:)
输入
输入包含多个测试用例。每个测试用例单独占一行,包含上述描述的字符串S。
限制条件:输入中只能出现小写字母。1 <= S的长度 <= 400000。
输出
对于每个测试用例,按升序输出一行整数,表示可能的新生儿名字的长度。
#include<cstring>
#include<cstdio>
using namespace std;
#define N 400001
char s[N];
int nxt[N],q,dep[N],fa[N],n,ans[N];
int h=0;
int u;
void getn()
{
int t1=0,t2=-1;
nxt[0]=-1;
while(t1<strlen(s))
{
if(t2==-1)
{
nxt[++t1]=++t2;
continue;
}
if(s[t1]==s[t2])
{
nxt[++t1]=++t2;
}
else t2=nxt[t2];
}
}
signed main()
{
while(~scanf("%s",s))
{
memset(nxt,0,sizeof nxt);
getn();
u=strlen(s);
while(u)
{
ans[++h]=u;
u=nxt[u];
}
while(h) printf("%d ",ans[h--]);
puts("");
}
return 0;
}