hdu 6194 后缀数组

题意:一个字符串,查询恰好出现k次的子串的数目

思路:后缀数组在height上进行操作。我们直接枚举长度为k的区间求min值,但是要注意的是直接这么算是会重复的,同时也可能超过k次,这样我们就需要把枚举的前一个和后一个都判断一下,这样保证了等于k次,同时也保证了没有重复统计。

代码:

#include<bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define MEM(a,b) memset(a,b,sizeof(a))
using namespace std;const int MAXN = 5e5+100;
int t1[MAXN], t2[MAXN], c[MAXN],n;
bool cmp(int *r, int a, int b, int l)
{return r[a] == r[b] && r[a + l] == r[b + l];
}
void da(int str[], int sa[], int zrank[], int height[], int n, int m){n++;int i, j, p, *x = t1, *y = t2;//第一轮基数排序,如果s的最大值很大,可改为快速排序for (i = 0; i < m; i++)c[i] = 0;for (i = 0; i < n; i++)c[x[i] = str[i]]++;for (i = 1; i < m; i++)c[i] += c[i - 1];for (i = n - 1; i >= 0; i--)sa[--c[x[i]]] = i;for (j = 1; j <= n; j <<= 1){p = 0;//直接利用sa数组排序第二关键字for (i = n - j; i < n; i++)y[p++] = i;//后面的j个数第二关键字为空的最小for (i = 0; i < n; i++)if (sa[i] >= j)y[p++] = sa[i] - j;//这样数组y保存的就是按照第二关键字排序的结果//基数排序第一关键字for (i = 0; i < m; i++)c[i] = 0;for (i = 0; i < n; i++)c[x[y[i]]]++;for (i = 1; i < m; i++)c[i] += c[i - 1];for (i = n - 1; i >= 0; i--)sa[--c[x[y[i]]]] = y[i];//根据sa和x数组计算新的x数组swap(x, y);p = 1; x[sa[0]] = 0;for (i = 1; i < n; i++)x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;if (p >= n)break;m = p;//下次基数排序的最大值}int k = 0;n--;for (i = 0; i <= n; i++)zrank[sa[i]] = i;for (i = 0; i < n; i++){if (k)k--;j = sa[zrank[i] - 1];while (str[i + k] == str[j + k])k++;height[zrank[i]] = k;}
}
int m_rank[MAXN], height[MAXN];
int RMQ[MAXN];
int mm[MAXN];
int best[30][MAXN];
void initRMQ(int n){mm[0] = -1;for (int i = 1; i <= n; i++)mm[i] = ((i&(i - 1)) == 0) ? mm[i - 1] + 1 : mm[i - 1];for (int i = 1; i <= n; i++)best[0][i] = i;for (int i = 1; i <= mm[n]; i++)for (int j = 1; j + (1 << i) - 1 <= n; j++){int a = best[i - 1][j];int b = best[i - 1][j + (1 << (i - 1))];if (RMQ[a]<RMQ[b])best[i][j] = a;else best[i][j] = b;}
}
int askRMQ(int a, int b){int t;t = mm[b - a + 1];b -= (1 << t) - 1;a = best[t][a]; b = best[t][b];return RMQ[a]<RMQ[b] ? a : b;
}
char str[MAXN];
int r[MAXN];
int sa[MAXN];
int Q[MAXN];int lcp(int a, int b){//a = m_rank[a]; b = m_rank[b];if(a==b) return n-sa[a];if (a>b)swap(a, b);return height[askRMQ(a + 1, b)];
}int main() {int t, k;scanf("%d", &t);while (t--) {scanf("%d", &k);scanf("%s", str);n = strlen(str);for (int i = 0; i < n; i++)r[i] = str[i];r[n] = 0;da(r, sa, m_rank, height, n, 256);long long ans = 0;for (int i = 1; i <= n; i++) {RMQ[i] = height[i];}initRMQ(n);memset(Q, 0, sizeof(Q));for (int i = 0; i+k<=n; i++) {Q[i+1] = lcp(i+k,i);}int ret;ans=0;for (int i = 0; i+k-1 <=n; i++) {ret=lcp(i+k-1,i);ans = ans+(long long)max(0,ret-max(Q[i], Q[i+1]));}printf("%lld\n", ans);}return 0;
}


转载于:https://www.cnblogs.com/zhangxianlong/p/10672485.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux grep命令 例子,14个grep命令使用例子

所有的类linux系统都会提供一个名为grep(global regular expression print&#xff0c;全局正则表达式输出)的搜索工具。grep命令在对一个或多个文件的内容进行基于模式的搜索的情况下是非常有用的。模式可以是单个字符、多个字符、单个单词、或者是一个句子。当命令匹配到执行…

JSP动作元素

https://www.w3cschool.cn/jsp/jsp-actions.html JSP动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。 动作是第三种类型的语法元素&#xff0c;它们被转换成java代码来执行操作。如访问一个java对象或调用方法 利用JSP动作可以动态地插入文件、重用JavaBean组件…

c语言中的所有代码大全,C语言库函数代码大全

O类字母函数名: open 功 能:打开一个文件用于读或写 用 法: int open(char *pathname,int access[, int permiss]); 程序例: #include#include#include#include int main(void) { inthandle; char msg[] "Helloworld";if ((handle open("TEST.$$$", O_CRE…

依赖注入通俗解释_我如何向团队解释依赖注入

依赖注入通俗解释最近&#xff0c;我们公司开始开发一个新的基于Java的Web应用程序&#xff0c;经过一些评估过程&#xff0c;我们决定使用Spring。 但是许多团队成员并不了解Spring和Dependency Injection的原理。 因此&#xff0c;我被要求给出一个速成班&#xff0c;讲解什么…

session cookie

http://www.cnblogs.com/andy-zhou/p/5360107.html&#xff08;牛逼网址&#xff09; http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html&#xff08;同款牛逼&#xff09; cookie: session: Session是另一种记录客户状态的机制&#xff0c;不同的是Cookie保存…

C语言程序设计二期末考试,9第二学期期末考试《C语言程序设计》A

期末试题 二级c语言………………………………装………………………………订…………………………………线………………………………安徽工业大学题纸(一)2009~2010学年第一学期期末考试《C程序设计(2)》试卷 A考试时间&#xff1a;120分钟满分&#xff1a;100分(作题答案一律写…

SWT ScrolledComposite解释

就像我的一个朋友曾经说过的那样&#xff0c;SWT的ScrolledComposite是令人讨厌的野兽。 在某种程度上&#xff0c;我同意。 这可能是为什么有太多关于如何使用此小部件的问题的原因。 但不仅是ScrolledComposite的作者受到了谴责。 当某个软件无法按您预期的方式工作时&#…

c语言中变量的值十进制,C语言中介绍的整型变量 即十进制 十六进制什么的是什么意思 能具体解释一下吗 还有换算什么的 谢谢...

二进制.八进制.十进制.十六进制.编程序时不需要换算。输入的时候八进制%o十六进制%x十进制%d在计算机都一样是二进制&#xff0c;不影响计算&#xff0c;不存在转换问题。输出的时候&#xff0c;同理用%o,%d,%x输出相应的进制。(0.56)85*8-16*8-2(0.71875)10(12A)161*1622*161A…

大数相加c语言思路,大数相加

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include /**** 定义双向节点* 数据区为一个整型数字***/struct Node {int number;//数据区&#xff0c;仅一个数字&#xff0c;保存一位数字struct Node * next;struct Node * prev;};typedef struct Node Node;/*** 创建…

关联关系、依赖关系总结

一、关联关系总结&#xff1a; 1.对象和对象之间的连接。在Java中&#xff0c;关联关系的代码表现形式为一个类做为另一个类的属性类型存在。即“有”的关系&#xff1a;”has-a”。 2.关联关系的方向&#xff1a;关联关系分为单向关联和双向关联 ①单向关联&#xff1a; A类…

使用cglib创建代理对象

在上一篇文章中&#xff0c;我讨论了基于标准Java的代理对象。 当您要在实现接口的对象上具有方法调用处理程序时&#xff0c;可以使用这些方法。 Java反射代理的创建要求您具有一个实现接口的对象。 我们要代理的对象已经失控&#xff0c;它没有实现我们要从处理程序调用的接口…

四阶龙格库塔c语言,四阶龙格库塔算法的C语言实现

解微分方程&#xff12;&#xff10;&#xff10;&#xff11;年&#xff13;月焦作大学学报&#xff2a;&#xff2f;&#xff35;&#xff32;&#xff2e;&#xff21;&#xff2c;&#xff2f;&#xff26;&#xff2a;&#xff29;&#xff21;&#xff2f;&#xff3a;&a…

8个超震撼的HTML5和纯CSS3动画源码

HTML5和CSS3之所以强大&#xff0c;不仅因为现在大量的浏览器的支持&#xff0c;更是因为它们已经越来越能满足现代开发的需要。Flash在几年之后肯定会消亡&#xff0c;那么HTML5和CSS3将会替代Flash。今天我们要给大家分享8个最新的HTML5和纯CSS3动画及其源码&#xff0c;这些…

c语言打砖块游戏代码,打砖块游戏的源代码(请多指教)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#include#includevoid draw(int x1){int m0,n0,x40,y20;int t0,i,j,k1;int a0,b127,c88;for(i0;i<8;i){ni*20;yn20;for(j0;j<16-t;j){m(ji)*40;xm40;int points[]{m,n,x,n,x,y,m,y}; setfillstyle(R…

git本地创建新分支并推送到远程仓库

1,在当前项目目录&#xff0c;从已有的分支创建新的分支(如从master分支),创建一个dev分支 git checkout -b dev 2,创建完可以查看一下,分支已经切换到dev git branch * dev master 3,提交该分支到远程仓库 git push origin dev 4,测试从远程获取dev git pull origin dev 5,我觉…

javadoc 开源项目_在下一个项目中不使用JavaDoc的5大原因

javadoc 开源项目JavaDoc对于框架和库的开发是绝对必需的&#xff0c;这些框架和库为其他框架&#xff08;例如Spring Framework&#xff0c;JDK&#xff09;提供了公共接口。 对于内部企业软件和/或产品开发&#xff0c;我有以下原因会在将来忽略“ 100&#xff05;JavaDoc Po…

android拍照功能无预览,Android 无预览拍照

最近得到了一个需求&#xff0c;在后台拍照并保存public void onTakePhotoClicked() {final SurfaceView preview new SurfaceView(this);SurfaceHolder holder preview.getHolder();// deprecated setting, but required on Android versions prior to 3.0holder.setType(Su…

vim选中字符复制/剪切/粘贴

问题描述&#xff1a; vim 中选中指定字符&#xff0c;进行复制/剪切/粘贴 问题解决&#xff1a; 进入vim中visual模式&#xff0c;visual模式进入&#xff0c;可以有三种方式&#xff1a; &#xff08;1&#xff09;在普通模式&#xff08;normal&#xff09;下&#xf…

使用JavaFX构建反应系统

JavaFX是用于在Java中构建图形应用程序的新标准库&#xff0c;但是许多程序员仍然对Swing甚至&#xff08;高音&#xff09;AWT感到困惑。 在Java诞生20年来&#xff0c;发生了很多事情。 两年前&#xff0c;当我开始研究Speedment UI的JavaFX库时&#xff0c;发现很多东西很着…

android中访问手机存储空间,android – 访问手机内部存储以推入SQLite数据库文件...

我正在使用Netbeans和java开发我的android应用程序.当我使用模拟器时,我可以通过访问以下路径,data / data / com.example.helloandroid / database来访问File explorer并将SQLite数据库插入设备内部存储器但是当我使用真实设备时,我无法访问此位置以将SQLite文件推送到手机的内…