[2010Beijing Wc]外星联络

本文介绍了一种通过构建后缀字母树来找出一个01串中所有重复子串的方法,并提供了完整的C++实现代码。该算法首先生成原串的所有后缀,接着使用后缀字母树进行处理,最终输出重复子串及其出现次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

给一个01串,找到他接受到的 01 串中所有重复出现次数大于 1 的子串。输出的顺序按对应的子串的字典序排列。

思路

搞出原串的n个后缀串。

然后用字母树或后缀数组。

应该叫后缀字母树。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 3001 
struct node
{
	int cnt;
	node* next[2];
	node(){cnt=1;next[0]=next[1]=NULL;} 
}root[MAX*MAX],*etop;
void init()
{
	etop=root; 
	etop++;
} 
node *fr;
void add(int a)
{
	if (!fr->next[a])
	{
		//etop->cnt=1;
		fr->next[a]=etop;
		etop++;
	} 
	else
		fr->next[a]->cnt++;
	fr=fr->next[a]; 
} 
int n;
char ch[MAX];
void dfs(node *p)
{
	if(p->cnt>=2) printf("%d\n",p->cnt);
	if(p->next[0]) dfs(p->next[0]);
	if(p->next[1]) dfs(p->next[1]);
} 
int main()
{
	scanf("%d",&n);
	scanf("%s",ch); 
	init();
	for (int i=0;i<n;i++)
	{
		fr=root; 
		for (int j=i;j<n;j++)
		{
			add(ch[j]-'0');
		}
	} 
	dfs(root); 
	return 0; 
} 

感谢耒阳大视野教育培训机构: http://61.187.179.132/JudgeOnline/problem.php?id=2251

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值