HDU 4622 求解区间字符串中的不同子串的个数
题目大意:
给定一个长度<2000的串,再给最多可达10000的询问区间,求解区间字符串中的不同子串的个数
这里先考虑求解一整个字符串的所有不同子串的方法
对于后缀自动机来说,我们动态往里添加一个字符,每次添加一个字符进去,我们只考虑那个生成的长度为当前长度的后缀自动机的节点
那么这个节点可接收的字符串的个数就是( p->l - p->f->l ),也就是以当前点为最后节点所能得到的与之前不重复的子串的个数
那么这个问题就很好解决了,共2000个位置,以每一个位置为起点构建一次后缀自动机,一直构建到最后一个字符,过程中不断记录所能得到的子串个数
把这个个数动态保存到f[][]数组中
那么打好了表,最后询问的时候,直接访问这个f[][]即可
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 #define N 2005 8 #define M 26 9 struct SamNode{ 10 SamNode *son[M] , *f; 11 int l; 12 void init(){ 13 for(int i=0 ; i<M ; i++) son[i] = NULL; 14 f=NULL , l=0; 15 } 16 }sam[N<<1] , *root , *last; 17 18 int cnt , f[N][N] , ret; 19 char s[N] ; 20 21 void init(){ 22 sam[0].init(); 23 root = last = &sam[cnt=0]; 24 } 25 26 void add(int x) 27 { 28 SamNode *p = &sam[++cnt] , *jp=last; 29 p->init(); 30 p->l = jp->l+1; 31 last = p; 32 for(; jp&&!jp->son[x] ; jp=jp->f) jp->son[x] = p; 33 if(!jp) p->f = root; 34 else{ 35 if(jp->l+1 == jp->son[x]->l) p->f = jp->son[x]; 36 else{ 37 SamNode *r = &sam[++cnt] , *q = jp->son[x]; 38 r->init(); 39 *r = *q; r->l = jp->l+1; 40 p->f = q->f = r; 41 for( ; jp&&jp->son[x]==q ; jp=jp->f) jp->son[x] = r; 42 } 43 } 44 ret += p->l-(p->f->l); 45 } 46 47 void solve() 48 { 49 int len = strlen(s); 50 for(int i=0 ; i<len ; i++){ 51 ret = 0; 52 init(); 53 for(int j=i ; j<len ; j++){ 54 add(s[j]-'a'); 55 f[i][j] = ret; 56 } 57 } 58 } 59 60 int main() 61 { 62 // freopen("a.in" , "r" , stdin); 63 int T; 64 scanf("%d" , &T); 65 while(T--) 66 { 67 scanf("%s", s); 68 int m , l , r; 69 scanf("%d" , &m); 70 solve(); 71 while(m--){ 72 scanf("%d%d" , &l , &r); 73 printf("%d\n" , f[l-1][r-1]); 74 } 75 } 76 return 0; 77 }
转载于:https://www.cnblogs.com/CSU3901130321/p/4596687.html
HDU 4622 求解区间字符串中的不同子串的个数相关推荐
- 求字符串中回文子串的个数(回文树详解)
写法一: #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h ...
- 输入字符串中含有该字符的个数
2019独角兽企业重金招聘Python工程师标准>>> ##需求:写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小 ...
- python在长字符串中寻找重复子串_Python 入门到精通
1.变量 1.python不用事先声明变量,赋值过程中就包含了变量声明和定义的过程 2.用"="赋值,左边是变量名,右边是变量的值 1.1. 数字 整数 int_var = 1 长 ...
- String类型的算法题(获取子串在主串中出现的次数)和(获取两个字符串中最大相同子串)-Java代码实现
Java获取子串在主串中出现的次数 package BaiYSExer2;import org.junit.Test; /*** @author Baiysmart* @create 2020-03- ...
- 字符串匹配:字符串中查找某子串
字符串匹配:字符串中查找某子串 需求 具体算法 常规方法 程序 KMP算法 程序 后续 需求 我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法.而目前常用的字符串匹配算法有很多, ...
- 获取两个字符串中最大相同子串
题目说明: 获取两个字符串中最大相同子串.比如:str1 = "abcwerthelloyuiodefabcdef";str2 = "cvhellobnm"提示 ...
- 从字符串中提取IP子串(C语言)
1 目标 ① 从字符串中提取IP子串 ② 验证IP字符串是否合法(IPV4) 2 代码 ① ip地址提取 /*** @brief : IPv4地址提取* @param in_ip : 待提取字符串* ...
- js 编写一个程序实现统计一串字符串中的英文小写字母个数!
编写一个程序实现统计一串字符串中的英文小写字母个数!例 如:输入"axZvnNgOuyi",得到的值应该是 8: 注意:且有输入输出,直接输出不计分 <!DOCTYPE ht ...
- 查找一个字符串中的所有子串的位置
/***查找一个字符串中的所有子串的位置* * */function searchSubStr(str: any, subStr: any, positions: any): void {let po ...
最新文章
- CSP认证201512-4	送货[C++题解]:无向图欧拉路径、并查集、dfs
- 网易云信联合浙江大学信电学院成立创新与实践基地,探索音视频前沿技术
- Spring事物的实现方式和原理以及隔离级别
- 【转载】周鸿祎:做产品体验先把自己切换到二傻子模式
- Java工作笔记-JPA查询达梦7数据库(Spring Boot + ORM)
- 老员工在线“黑”华为:早期手机难看丢人 习惯另外带苹果三星
- android 软件测试文档,Android软件测试文档规范【参考】.doc
- Scrum vs Waterfall vs Agile vs Lean vs Kanban
- 山东烟建借沟通CTBS实现财务数据大集中
- 狗都能看懂的Pytorch MAML代码详解
- 动态生成的chosen实现模糊查询
- CSS实现多余文本隐藏
- 用R语言计算班级各门课程的加权平均分
- 优秀站长工具推荐之百度统计热力图用户体验要素
- 运算放大器的差分放大电路
- python读取oracle数据库性能_python 连接oracle数据库,报错解决,pandas读取。
- mysql 三阶多项式拟合,《统计学习导论-基于R应用》第三章:线性回归(代码)...
- 耗时3个月整理的网络安全学习路线,非常详细!
- matlab中true()函数的用法
- 《从你的全世界路过》
热门文章
- 全连接的多层神经网络结构(MultiLayerNet)
- ApiBoot - ApiBoot Swagger 使用文档
- 【云周刊】第120期:麒麟来了!PUE逼近1.0,阿里展示液冷黑科技
- Android PullToRefreshListView上拉刷新和下拉刷新
- struts2-简单登录实现
- 为什么要重写hashCode()
- Bootstrap3.0入门学习系列规划[持续更新]
- 问题 G: 三个数比较大小
- matlab打开时总闪一下才打开_大家装窗帘轨道时,是不是多数都是下面这样的: 打开网易新闻 查看更多图片 或者做个窗帘盒,遮盖一下?...
- python传文件_Python实现Windows和Linux之间互相传输文件(文件夹)的方法