热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

BZOJ1396:识别子串(后缀自动机+单调队列)

题面题意:给出一个串串,对于每个位置求包含每个位置的,最短的,只出现一次的子串的长度由区间的套路,只要求出以每个位置为L,最小的R,设为f[L]rolepresentati

题面
题意:给出一个串串,对于每个位置
求包含每个位置的,最短的,只出现一次的子串的长度

由区间的套路,只要求出以每个位置为L,最小的R,设为f[L]" role="presentation" > f [ L ]

显然f" role="presentation" > f 单调不降

在后缀自动机上,考虑Right集大小为1的状态T
发现f[1]到f[dep[T]−Min(T)+1]" role="presentation" > f [ 1 ] f [ d e p [ T ] M i n ( T ) + 1 ] 可用dep[T]更新

对于每个位置i,考虑以它为右端点
找到第一个f[h]<i" role="presentation" > f [ h ] < i 的h,i-h+1可更新ans[i]
若不以其为右端点,则j&#x2208;[h+1,i]" role="presentation" > j [ h + 1 , i ] f[j]&#x2212;j+1" role="presentation" > f [ j ] j + 1 可更新ans[i]

单调队列维护即可
zenzen不用线段树哦

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))

typedef long long LL;

const int N=400200,oo=1e9+7;

int n;
int pre[N],dep[N],r[N],son[N][26],cnt=1,last=1;
int head[N],nex[N],to[N],cur;
int len[N],ans[N],q[N];
char s[N];

void add(int u,int v)
{
    to[++cur]=v;
    nex[cur]=head[u];
    head[u]=cur;
}

void dfs(int x)
{
    for(int h=head[x];h;h=nex[h])
    dfs(to[h]),r[x]+=r[to[h]];
}

void Insert(int x)
{
    dep[++cnt]=dep[last]+1;
    int np=cnt,p=last;
    last=cnt;
    r[np]=1;
    for(;!son[p][x];p=pre[p])
    son[p][x]=np;
    if(!p)
    pre[np]=1;
    else
    {
        int q=son[p][x];
        if(dep[q]==dep[p]+1)
        pre[np]=q;
        else
        {
            dep[++cnt]=dep[p]+1;
            int nq=cnt;
            pre[nq]=pre[q];
            pre[q]=pre[np]=nq;
            mmcp(son[nq],son[q]);
            for(;son[p][x]==q;p=pre[p])
            son[p][x]=nq;
        }
    }
}

int main()
{
    scanf("%s",s+1);
    n=strlen(s+1);
    for(int i=1;i<=n;i++)
    Insert(s[i]-'a');

    for(int i=2;i<=cnt;i++)
    add(pre[i],i);

    dfs(1);
    for(int i=1;i<=n;i++)
    ans[i]=len[i]=oo;

    for(int i=2;i<=cnt;i++)
    if(r[i]==1)
    len[dep[i]-dep[pre[i]]]=min(len[dep[i]-dep[pre[i]]],dep[i]);

    for(int i=n-1;i>=1;i--)
    len[i]=min(len[i],len[i+1]);

    int now=n,hh=1,tt=0;
    for(int i=n;i>=1;i--)
    {
        while(now>=1&&len[now]>i)
        {
            while(hh<=tt&&len[q[tt]]-q[tt]>=len[now]-now)
            tt--;
            if(len[now]!=oo&&now<=i)
            q[++tt]=now;
            now--;
        }
        if(now)
        ans[i]=min(ans[i],i-now+1);
        if(hh<=tt)
        ans[i]=min(ans[i],len[q[hh]]-q[hh]+1);
        if(q[hh]==i)
        hh++;
    }

    for(int i=1;i<=n;i++)
    printf("%d\n",ans[i]);

    return 0;
}

推荐阅读
  • 本文探讨了如何解决HAOI2007竞赛中的理想正方形问题。通过计算矩阵中每个N×N子矩阵的最大值和最小值,最终求得所有子矩阵中最大值与最小值差的最小值。 ... [详细]
  • 深度解析 Redis 消息队列的应用与优势
    本文深入探讨了消息队列的基本概念及其在Redis中的实现方式。通过分析消息队列的核心组件——消息、生产者和消费者,以及它与阻塞队列的主要区别,帮助读者更好地理解如何利用Redis消息队列提高应用性能。 ... [详细]
  • Canvas漫游:碰撞检测与动画模拟
    探索Canvas在Web开发中的应用,通过碰撞检测与动画模拟提升交互体验。 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • MainActivityimportandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;im ... [详细]
  • 利用RabbitMQ实现高效延迟任务处理
    本文详细探讨了如何利用RabbitMQ实现延迟任务,包括其应用场景、实现原理、系统设计以及具体的Spring Boot实现方式。 ... [详细]
  • [Head First设计模式笔记]命令模式
    命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。类图:适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插 ... [详细]
  • Redis并发控制与集群管理
    本文探讨了在高并发场景下使用Redis进行并发控制的方法,以及如何通过Redis集群和可视化工具提升系统的稳定性和可维护性。 ... [详细]
  • 本文概述了五种常用的查找算法:线性查找、二分查找、二叉搜索树查找、哈希查找和索引查找。每种方法都有其适用场景和性能特点。 ... [详细]
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
  • 本文探讨了一种高效的方法来解决LeetCode上的经典问题——寻找给定字符串中的最长无重复字符子串。 ... [详细]
  • 本文详细介绍了如何使用递归方法对栈中的所有元素进行排序,确保从栈顶到底部的元素按升序排列。通过具体的代码示例,帮助读者理解栈排序的核心思想及实现步骤。 ... [详细]
  • 在研究Linux内核代码时,经常会遇到与‘队列’相关的术语。本文旨在全面介绍Linux系统中几种常见的队列类型及其应用,帮助读者更好地理解和使用这些机制。 ... [详细]
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • 连续正数序列之和等于目标值的解法探讨
    给定一个正整数目标值,找出所有连续正整数序列,其和等于目标值。这些序列需至少包含两个数,且序列中的数字应从小到大排列。不同的序列根据其首个数字的大小顺序排列。 ... [详细]
author-avatar
g我爱他偶买噶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有