bzoj1396_bzoj3771

bzoj1396_bzoj3771传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1396题目大意:题解:后缀自动机,只出现一次,那么就是right值为1,那么对于一段1—-L—-R来说,(L—-R)为一个最短识别子串对于(1—-L-1)则可以用R-i+1来更新,对于(L—R)则可以用R-L+1来更新,那么两个线段树来维护即可。代码:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1396

题目大意:

bzoj1396_bzoj3771

题解:后缀自动机,只出现一次,那么就是right值为1,那么对于一段1—-L—-R来说,(L—-R)为一个最短识别子串对于(1—-L-1)则可以用R-i+1来更新,对于(L—R)则可以用R-L+1来更新,那么两个线段树来维护即可。

代码:

bzoj1396_bzoj3771
bzoj1396_bzoj3771

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define maxn 100005
 7 using namespace std;
 8 char s[maxn];
 9 int n,m,tot,root;
10 bool v[maxn*2];
11 struct data{
12     int last,son[maxn*2][26],val[maxn*2],fa[maxn*2];
13     void prepare(){root=last=tot=1;}
14     int newnode(int x){val[++tot]=x; return tot;}
15     void extend(int x)
16     {
17         int p=last,np=newnode(val[p]+1); last=np; 
18         for (; p && !son[p][x]; p=fa[p]) son[p][x]=np;
19         if (!p) fa[np]=root;
20         else
21         {
22             int q=son[p][x];
23             if (val[q]==val[p]+1) fa[np]=q;
24             else
25             {
26                 int nq=newnode(val[p]+1);
27                 memcpy(son[nq],son[q],sizeof(son[nq]));
28                 fa[nq]=fa[q];fa[q]=fa[np]=nq;
29                 for (; p && son[p][x]==q; p=fa[p]) son[p][x]=nq; 
30              } 
31          } 
32     }
33     void build ()
34     {
35         for (int i=1; i<=n; i++) extend(s[i]-'a'); 
36     }
37     void whoisfather()
38     {
39         for (int i=1; i<=tot; i++) v[fa[i]]=1;
40     }
41 }SAM;
42 struct T{
43     int mn[maxn*4];
44     T(){memset(mn,0x3f,sizeof(mn));}
45     void insert(int z,int l,int r,int x,int y,int w){
46         if(l>y||r<x) return;
47         if(l>=x&&r<=y){mn[z]=min(mn[z],w);return;}
48         int mid=(l+r)>>1;
49         insert(z*2,l,mid,x,y,w); insert(z*2+1,mid+1,r,x,y,w);
50     }
51     int query(int z,int l,int r,int x){
52         if(l==r&&l==x) return mn[z];
53         int mid=(l+r)>>1;
54         if(x<=mid) return min(mn[z],query(z*2,l,mid,x));
55         else return min(mn[z],query(z*2+1,mid+1,r,x));
56     }
57 }f,t;
58 int main()
59 {
60     scanf("%s",s+1); n=strlen(s+1);
61     SAM.prepare();
62     SAM.build();
63     SAM.whoisfather();
64     for (int i=1; i<=tot; i++)
65     {
66         if (!v[i])
67         {
68             int l=SAM.val[i]-SAM.val[SAM.fa[i]],r=SAM.val[i];
69             f.insert(1,1,n,l,r,r-l+1);
70             if (l>1) t.insert(1,1,n,1,l-1,r);
71         }
72     }
73     for (int i=1; i<=n; i++) printf("%d\n",min(f.query(1,1,n,i),t.query(1,1,n,i)-i+1));
74 }

View Code

 注:oyzx神犇清早刷神题,我就只能默默写渣渣题。

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169941.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • INTEGER PRIMARY KEY AUTOINCREMENT 和 INTEGER PRIMARY KEY 区别

    INTEGER PRIMARY KEY AUTOINCREMENT 和 INTEGER PRIMARY KEY 区别转自网络 地址不可考 谢谢原作者 如有冒犯 立即删除 Sqlite 中 INTEGERPRIMA 和 rowid INTEGERPRIMA 的使用 nbsp 在用 sqlite 设计表时 每个表都有一个自己的整形 id 值作为主键 插入后能直接得到该主键 nbsp 因为 sqlite 内部本来就会为每个表加上一个 rowid 这个 rowid 可以当成一个隐含的字段使用 nbsp 但

    2025年9月2日
    0
  • 前端进大厂难吗_java程序员怎么才能进大厂

    前端进大厂难吗_java程序员怎么才能进大厂冰河肝了一个月整理的并发编程知识体系,这应该是全网最全的并发编程知识体系了,学完进大厂不再难,强烈建议收藏!!

    2022年8月22日
    8
  • leetcode最长回文子串_最长回文子串算法

    leetcode最长回文子串_最长回文子串算法C++实现——最长回文子串

    2022年10月16日
    1
  • 搭建普罗米修斯Prometheus监控系统「建议收藏」

    搭建普罗米修斯Prometheus监控系统「建议收藏」一、普罗米修斯监控概述1、什么是普罗米修斯监控Prometheus(由go语言(golang)开发)是一套开源的监控&报警&时间序列数据库的组合。适合监控docker容器。因为K8S的流行带动了Prometheus的发展。2、官方网站https://prometheus.io/docs/introduction/overview/二、时间序列数据1、什么是时间序列数据时间序列数据(TimeSeriesData):按照时间顺序记录系统、设备状态变化的数据被称为时序数据。应用场景

    2022年7月19日
    118
  • java单例模式案例,及单例体现的关键

    java单例模式案例,及单例体现的关键

    2021年7月16日
    73
  • Ios frida_frida

    Ios frida_frida一、FridaFrida是一款基于Python+javascript的hook框架,通杀android\iOS\linux\win\osx各平台。Frida原理是手机端安装一个server程序把手机端的端口转到PC端写的python脚本进行通信,而Python脚本中采用javascript语言编写hook代码。①installfridaondeviceStartCydiaandaddFrida’srepositorybynavig

    2025年6月22日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号