站外题求条(TLE)
  • 板块学术版
  • 楼主zhangjizhi
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/7/29 21:13
  • 上次更新2025/7/30 11:03:41
查看原帖
站外题求条(TLE)
723989
zhangjizhi楼主2025/7/29 21:13

原题面为英文,下面使用了 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;
}
2025/7/29 21:13
加载中...