题目大意:

给定一个长度<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 求解区间字符串中的不同子串的个数相关推荐

  1. 求字符串中回文子串的个数(回文树详解)

    写法一: #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h ...

  2. 输入字符串中含有该字符的个数

    2019独角兽企业重金招聘Python工程师标准>>> ##需求:写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小 ...

  3. python在长字符串中寻找重复子串_Python 入门到精通

    1.变量 1.python不用事先声明变量,赋值过程中就包含了变量声明和定义的过程 2.用"="赋值,左边是变量名,右边是变量的值 1.1. 数字 整数 int_var = 1 长 ...

  4. String类型的算法题(获取子串在主串中出现的次数)和(获取两个字符串中最大相同子串)-Java代码实现

    Java获取子串在主串中出现的次数 package BaiYSExer2;import org.junit.Test; /*** @author Baiysmart* @create 2020-03- ...

  5. 字符串匹配:字符串中查找某子串

    字符串匹配:字符串中查找某子串 需求 具体算法 常规方法 程序 KMP算法 程序 后续 需求 我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法.而目前常用的字符串匹配算法有很多, ...

  6. 获取两个字符串中最大相同子串

    题目说明: 获取两个字符串中最大相同子串.比如:str1 = "abcwerthelloyuiodefabcdef";str2 = "cvhellobnm"提示 ...

  7. 从字符串中提取IP子串(C语言)

    1 目标 ① 从字符串中提取IP子串 ② 验证IP字符串是否合法(IPV4) 2 代码 ① ip地址提取 /*** @brief : IPv4地址提取* @param in_ip : 待提取字符串* ...

  8. js 编写一个程序实现统计一串字符串中的英文小写字母个数!

    编写一个程序实现统计一串字符串中的英文小写字母个数!例 如:输入"axZvnNgOuyi",得到的值应该是 8: 注意:且有输入输出,直接输出不计分 <!DOCTYPE ht ...

  9. 查找一个字符串中的所有子串的位置

    /***查找一个字符串中的所有子串的位置* * */function searchSubStr(str: any, subStr: any, positions: any): void {let po ...

最新文章

  1. CSP认证201512-4 送货[C++题解]:无向图欧拉路径、并查集、dfs
  2. 网易云信联合浙江大学信电学院成立创新与实践基地,探索音视频前沿技术
  3. Spring事物的实现方式和原理以及隔离级别
  4. 【转载】周鸿祎:做产品体验先把自己切换到二傻子模式
  5. Java工作笔记-JPA查询达梦7数据库(Spring Boot + ORM)
  6. 老员工在线“黑”华为:早期手机难看丢人 习惯另外带苹果三星
  7. android 软件测试文档,Android软件测试文档规范【参考】.doc
  8. Scrum vs Waterfall vs Agile vs Lean vs Kanban
  9. 山东烟建借沟通CTBS实现财务数据大集中
  10. 狗都能看懂的Pytorch MAML代码详解
  11. 动态生成的chosen实现模糊查询
  12. CSS实现多余文本隐藏
  13. 用R语言计算班级各门课程的加权平均分
  14. 优秀站长工具推荐之百度统计热力图用户体验要素
  15. 运算放大器的差分放大电路
  16. python读取oracle数据库性能_python 连接oracle数据库,报错解决,pandas读取。
  17. mysql 三阶多项式拟合,《统计学习导论-基于R应用》第三章:线性回归(代码)...
  18. 耗时3个月整理的网络安全学习路线,非常详细!
  19. matlab中true()函数的用法
  20. 《从你的全世界路过》

热门文章

  1. 全连接的多层神经网络结构(MultiLayerNet)
  2. ApiBoot - ApiBoot Swagger 使用文档
  3. 【云周刊】第120期:麒麟来了!PUE逼近1.0,阿里展示液冷黑科技
  4. Android PullToRefreshListView上拉刷新和下拉刷新
  5. struts2-简单登录实现
  6. 为什么要重写hashCode()
  7. Bootstrap3.0入门学习系列规划[持续更新]
  8. 问题 G: 三个数比较大小
  9. matlab打开时总闪一下才打开_大家装窗帘轨道时,是不是多数都是下面这样的: 打开网易新闻 查看更多图片 或者做个窗帘盒,遮盖一下?...
  10. python传文件_Python实现Windows和Linux之间互相传输文件(文件夹)的方法