1396: 识别子串

Description


Solution
只出现一次的点只能是叶子。
假设某一个叶子表示的区间是[1-Max]
它的父亲的长度是M。 也就是[Max-M,Max]只出现过一次。
那么我们可以用这M+1长来更新[Max-M,Max]。----A
剩下[1,Max-M]的位置x,可以用[x,Max]这段区间的长度来更新。---B
于是按下标开两棵线段树,一棵维护权值,实现A,一棵维护位置,实现B
然后就好啦

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define maxn 200005
using namespace std;
int n,cnt=1,rt=1,la=1,w[maxn],tr[maxn*20][2],root[maxn],tot,ans;
int num[maxn];
char ch[maxn];
struct node{int Max,par,nex[26],id;
}s[maxn];
vector<int>G[maxn];
void ins(int c,int id){int np=++cnt,p=la;la=np;s[np].Max=s[p].Max+1;s[np].id=id;for(;p&&!s[p].nex[c];p=s[p].par)s[p].nex[c]=np;if(!p)s[np].par=rt;else {int q=s[p].nex[c];if(s[q].Max==s[p].Max+1)s[np].par=q;else {int nq=++cnt;s[nq].Max=s[p].Max+1;s[nq].par=s[q].par;for(int i=0;i<26;i++)s[nq].nex[i]=s[q].nex[i];s[q].par=s[np].par=nq;for(;s[p].nex[c]==q;p=s[p].par)s[p].nex[c]=nq;}}
} int get(int v,int w){return (v&(1<<w))>0;
}
void add(int &R,int v){if(!R)R=++tot;int k=R;for(int i=20;i>=0;i--){int p=get(v,i);if(!tr[k][p])tr[k][p]=++cnt;k=tr[k][p];}
}
int merge(int x,int y){if(!x||!y)return x+y;tr[x][0]=merge(tr[x][0],tr[y][0]);tr[x][1]=merge(tr[x][1],tr[y][1]);return x;
}
int query(int x,int y,int d,int A){if(d<0)return A;int v=0;if(tr[x][0]&&tr[y][1]){v=max(v,query(tr[x][0],tr[y][1],d-1,A+(1<<d)));}if(tr[x][1]&&tr[y][0]){v=max(v,query(tr[x][1],tr[y][0],d-1,A+(1<<d)));}if(v)return v;if(tr[x][0]&&tr[y][0]){v=max(v,query(tr[x][0],tr[y][0],d-1,A));}if(tr[x][1]&&tr[y][1]){v=max(v,query(tr[x][1],tr[y][1],d-1,A));}return v;
}
void dfs(int k){for(int i=0;i<G[k].size();i++){dfs(G[k][i]);root[k]=merge(root[k],root[G[k][i]]);num[k]+=num[G[k][i]];}if(s[k].id!=0)add(root[k],w[s[k].id]),num[k]++;if(num[k]>1)ans=max(ans,query(root[k],root[k],20,0)+s[k].Max);
}
int main()
{    cin>>n;scanf("%s",ch+1);for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int i=n;i>=1;i--)ins(ch[i]-'a',i);for(int i=1;i<=cnt;i++)G[s[i].par].push_back(i);dfs(rt);cout<<ans<<endl;return 0;
}

View Code

转载于:https://www.cnblogs.com/liankewei/p/10662984.html

bzoj1396: 识别子串相关推荐

  1. BZOJ1396:识别子串(SAM)

    Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...

  2. 【BZOJ-13962865】识别子串字符串识别 后缀自动机/后缀树组 + 线段树

    1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 312  Solved: 193 [Submit][Status][Discus ...

  3. BZOJ 1396:识别子串 SA+树状数组+单调队列

    1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 381  Solved: 243 [Submit][Status][Discus ...

  4. ●BZOJ 1396 识别子串

    题链: http://www.joyoi.cn/problem/tyvj-2301(非权限OI患者,苟且在joyoi...) 题解: 后缀自动机,线段树 先对原串建立后缀自动机,不难发现, 会影响答案 ...

  5. python 识别子串的位置_Python基础语法小白这一篇就足够了!

    一个多星期的 Python基础语法学习结束,整理了一些常用必备的知识要点笔记.大家可以参考参考,内容比较长,知识点涉及还是蛮全面的(没面向对象),面向对象总结了以后会再单独发一篇,没有耐心的朋友可以直 ...

  6. 暑假集训 ---- 字符串2 (SAM专题)

    P1368 工艺 把串插入 S A M SAM SAM 插两次,然后贪心找最小字典序即可 [AHOI2013]差异 两个串的最长公共后缀就是后缀自动机上 lca 的长度 于是把两个串反过来,对于每一个 ...

  7. 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)

    [题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...

  8. 通过解决“构造包含所有给定子串的最短字符串”问题思考算法优化

    最近由于工作相对比较忙,需要学习一些新的技术项目,写代码的时间比较少.继续解决百度2017秋招4星的题目,今天要分析的这个题目,是目前我遇到相对其他4星题目算是有一点难度的题目. 今天我们将从一个题目 ...

  9. [基于子串搜索的方法] BNDM算法

    BNDM算法的搜索方法与BDM算法相同,但它使用了位并行来识别子串. 与原始的BDM相比,BNDM更简单,内存用量更少,具有更好的引用局部性,并且易于扩展到更复杂的模式串的情形.   在当前搜索窗口内 ...

  10. linux no mail for root,Linux定时任务Crontab使用 提示no crontab for root

    使用命令查询crontab 任务时,一直提示:no crontab for root .查看了一些资料,说是crontab在初始时,设置了一次编辑方式,所以试了一下crontab -e的方式编辑,即在 ...

最新文章

  1. 利用mem数组在MM32 MicroPython中实现COMP的功能
  2. 51CTO-ANDROID相关资料收集整理
  3. 鸿蒙撕系统裂安卓阵营,鸿蒙系统年底问世 安卓阵营是不是该瑟瑟发抖了
  4. 下面介绍几种查看linux版本信息的方法和GCC版本
  5. [转载] Java获取嵌套的json串里的返回结果
  6. 数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
  7. houghlinesp找到多条直线_拿什么拯救焦虑的你,一个有勇气的人终将找到他的路...
  8. Python-OpenCV人脸检测(代码)
  9. 使用Python绘制词云图(自定义形状)
  10. PS换照片底色(三种方式)
  11. 微服务架构下分布式事务解决方案
  12. Win2003安全警报--当前安全设置不允许从该位置下载文件
  13. 何为血缘分析?血缘分析能给我们带来什么影响?
  14. 蜡烛图(K线图)-2反转形态
  15. 2022.07.12 第九小组 高小涵 学习笔记
  16. JS: 参数传递(值传递和引用传递)
  17. 【转载】番茄时钟解说
  18. 【MySQL】MySQL 的连接(内、左、右、全)
  19. Java毕设项目高校智慧校园学生系统(java+VUE+Mybatis+Maven+Mysql)
  20. HTML+CSS期末大作业:美妆网站设计——化妆品企业(20页) 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码

热门文章

  1. Debian - RAID5搭建(热备)
  2. 游戏筑基开发之双链表及其基本功能(C语言)
  3. Not enough space in file systems for the current software selection. An additional XXXX MiB is neede
  4. linux中公钥和私钥的区别以及关系
  5. springboot无法加载oracle驱动终极解决
  6. Vue.js 代码优化浅谈
  7. [译] 或许你并不需要 Rust 和 WASM 来提升 JS 的执行效率 — 第二部分
  8. 王亚叶:洞悉客户心声用大数据运营
  9. 贫血模式or领域模式(转载)
  10. XNA 如何使用字体绘制文字,Windows Phone 游戏开发