hdu 6194 string string string 后缀数组+rmq+容斥

Synopsys SCL许可证服务器搭建详解:从安装到生成.dat文件 本文详细解析了Synopsys SCL许可证服务器的完整搭建流程,从系统环境准备、SCL安装到生成.dat文件。重点阐述了如何正确获取HOST ID、配置License文件以及调试常见故障,为数字芯片设计工程师提供了一套从零到一的实战避坑指南,确保EDA工具链稳定运行。 阅读详情


string string string

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1531    Accepted Submission(s): 440


Problem Description
Uncle Mao is a wonderful ACMER. One day he met an easy problem, but Uncle Mao was so lazy that he left the problem to you. I hope you can give him a solution.
Given a string s, we define a substring that happens exactly  k  times as an important string, and you need to find out how many substrings which are important strings.
 

Input
The first line contains an integer  T  ( T≤100 ) implying the number of test cases.
For each test case, there are two lines:
the first line contains an integer  k  ( k≥1 ) which is described above;
the second line contain a string  s  ( length(s)≤105 ).
It's guaranteed that  ∑length(s)≤2∗106 .
 

Output
For each test case, print the number of the important substrings in a line.
 

Sample Input
  
2 2 abcabc 3 abcabcabcabc
 

Sample Output
  
6 9
 

Source
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:   6205  6204  6203  6202  6201 
 

Statistic |  Submit |  Discuss |  Note
题意:求刚好出现k次的子串有多少个。

思路:我做这道题纯碎来学一下后缀数组怎么用。。。。首先构造好数组之后,每次枚举相邻k个排名的公共前缀,因为他要刚好出现k次,所以容斥减去出现k+1次再加上k+2次的就是贡献。。查询rmq预处理可以O(1),查询log应该也可以过。下面给代码:

#pragma comment(linker, "/STACK:102400000,102400000") 
#include<iostream>  
#include<cmath>  
#include<queue>  
#include<cstdio>  
#include<queue>  
#include<algorithm>  
#include<cstring>  
#include<string>  
#include<utility>
#include<set>
#include<map>
#include<stack>
#include<vector>
#define maxn 100005
#define inf  0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long LL;
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int MAXN = 100005;
int SA[MAXN], Rank[MAXN], Height[MAXN], tax[MAXN], tp[MAXN], a[MAXN], n, m;
int q;
int f[MAXN][20];
char str[MAXN];
//rank[i] 第i个后缀的排名; SA[i] 排名为i的后缀位置; Height[i] 排名为i的后缀与排名为(i-1)的后缀的LCP  
//tax[i] 计数排序辅助数组; tp[i] rank的辅助数组(计数排序中的第二关键字),与SA意义一样。  
//a为原串  
void RSort() {
	//rank第一关键字,tp第二关键字。  
	for (int i = 0; i <= m; i++) tax[i] = 0;
	for (int i = 1; i <= n; i++) tax[Rank[tp[i]]] ++;
	for (int i = 1; i <= m; i++) tax[i] += tax[i - 1];
	for (int i = n; i >= 1; i--) SA[tax[Rank[tp[i]]] --] = tp[i]; //确保满足第一关键字的同时,再满足第二关键字的要求  
} //计数排序,把新的二元组排序。  

int cmp(int *f, int x, int y, int w) { return f[x] == f[y] && f[x + w] == f[y + w]; }
//通过二元组两个下标的比较,确定两个子串是否相同  

void Suffix() {
	//SA  
	for (int i = 1; i <= n; i++) Rank[i] = a[i], tp[i] = i;
	m = 30, RSort(); //一开始是以单个字符为单位,所以(m = 127)  

	for (int w = 1, p = 1, i; p < n; w += w, m = p) { //把子串长度翻倍,更新rank  

		//w 当前一个子串的长度; m 当前离散后的排名种类数  
		//当前的tp(第二关键字)可直接由上一次的SA的得到  
		for (p = 0, i = n - w + 1; i <= n; i++) tp[++p] = i; //长度越界,第二关键字为0  
		for (i = 1; i <= n; i++) if (SA[i] > w) tp[++p] = SA[i] - w;

		//更新SA值,并用tp暂时存下上一轮的rank(用于cmp比较)  
		RSort(), swap(Rank, tp), Rank[SA[1]] = p = 1;

		//用已经完成的SA来更新与它互逆的rank,并离散rank  
		for (i = 2; i <= n; i++) Rank[SA[i]] = cmp(tp, SA[i], SA[i - 1], w) ? p : ++p;
	}
	//离散:把相等的字符串的rank设为相同。  
	//LCP  
	int j, k = 0;
	for (int i = 1; i <= n; Height[Rank[i++]] = k)
		for (k = k ? k - 1 : k, j = SA[Rank[i] - 1]; a[i + k] == a[j + k]; ++k);
	//这个知道原理后就比较好理解程序  
}

void Init() {
	scanf("%d%s", &q, str);
	n = strlen(str);
	for (int i = 0; i < n; i++) a[i + 1] = str[i] - 'a' + 1;
	a[n + 1] = 0;
}
void rmq(){
	for (int i = n; i > 1; i--)
	{
		for (int j = 0; i + (1 << j) - 1 <= n; j++)
		{
			if (!j)f[i][j] = Height[i];
			else f[i][j] = min(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
		}
	}
}
int getans(int l, int r){
	if (l > r)
		return n - SA[r] + 1;
	int k = log2(r - l + 1);
	return min(f[l][k], f[r - (1 << k) + 1][k]);
}
int main() {
	int t;
	scanf("%d", &t);
	while (t--){
		memset(SA, 0, sizeof(SA));
		memset(Height, 0, sizeof(Height));
		memset(Rank, 0, sizeof(Rank));
		memset(tax, 0, sizeof(tax));
		memset(tp, 0, sizeof(tp));
		Init();
		Suffix();
		rmq();
		LL ans = 0;
		for (int i = 1; i <= n - q + 1; i++){
			ans += getans(i + 1, i + q - 1);
			if (i > 1)
				ans -= getans(i, i + q - 1);
			if (i + q <= n)
				ans -= getans(i + 1, i + q);
			if (i > 1 && i + q <= n)
				ans += getans(i, i + q);
		}
		printf("%lld\n", ans);
	}
}


Spark Catalog详解 旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗?我:你应该静下心来好好把spark基础知识进行全面学习。实习生:难道spark有这功能,而我没有学习过?咋弄啊?我:学习一下Spark Catalog。实习生:啥是Catalog啊?Spark Catalog是Spark SQL中的一个元数据管理组件,它提供了一个集中化的存储和查询表、视图和函数的位置。 阅读详情

相关推荐

采用离散模型搭建永磁同步电机控制系统

永磁同步电机发电系统分为控制器和发电机,通过simulink仿真软件进行发电系统的离散系统仿真。离散搭建仿真,可以更方便的自动代码生成。通过实践经验离散模块搭建,更能加深对整个控制系统的理解。离散系统在矢量控制中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。PWM比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时0.5个开关周期Ts,也可以延时1个开关周期Ts,可以通过离散系统进行仿真,大大缩短开发周期。

f1072239934的博客 2863

HDU 6194 string string string

http://acm.hdu.edu.cn/showproblem.php?pid=6194题意: 给一个字符串,和一个k,问你串中出现k次的子串有多少个。哎,我这次要背大大的锅,从多校开始好多字符串SA的题都在wa,wa,wa,昨天沈阳网选的也是一直处于懵逼状态。还是做题不够多,做题时想的不够啊。 dalao们都说sam(后缀自动机)也可以过,我还是回去补补自动机吧,之后再补一篇博客。思路:

My_stage的博客 1481

大数据运维面试题及答案

1. 架构组成:- 2 个 NameNode(Active 活跃节点、Standby 备用节点),实时同步元数据(通过 JournalNode 集群,默认 3 个节点,存储 edits 日志,Active 写入、Standby 读取以保持元数据一致);- 容错性强:通过 RDD 的 “ lineage(血缘)” 机制,任务失败时可快速重算,无需从头执行。:集群 “大脑”,管理元数据(文件目录、块位置),实时响应客户端请求,数据存于内存,元数据镜像(fsimage)和编辑日志(edits)持久化到磁盘;

weixin_42795092的博客 908

HDU6194 string string string

后缀数组

ACoder 424

ad23新版Geber导出-官方教程(22.11版本后)

AD23新版本geber文件导出(含官方教程)-22.11之后的版本均可用此教程

安和的博客 3万+

用C++从零复刻Wordle:手把手教你实现命令行猜词游戏(含完整源码解析)

本文详细介绍了如何使用C++从零开始实现一个命令行版本的Wordle猜词游戏,包含完整的源码解析和核心模块设计。通过游戏逻辑控制器、单词库管理器等模块的构建,开发者可以学习C++实战技巧和性能优化方法,适合提升编程能力和游戏开发兴趣。

weixin_26763955的博客 334

HDU 6194 string string string

source:2017 ACM/ICPC Asia Regional Shenyang Online题意:给你n个字符串,问恰好出现k次的字符串有几种。用后缀数组构造出height数组后,注意到对于一段连续的长度为k的区间,前缀长度的下界为max(h[L],h[R+1),上界为min(h[L+1],h[L+2]...,h[R])

Tooc0ld 259

算法-基于MACD的Adaboost股价涨跌预测模型

MACD是一个指标,具体用法是MACD>0看涨,反之看跌,果真是这样的吗?由于所有的技术指标都基于对历史数据的统计,指标的滞后性也就难免,有时候MACD明明大于0,股价仍然跌,有时候macd小于0,股价仍然涨。 本文基于Adaboost算法提出了一种基于macd的线性阀值分类器作为若分类器,通过在限定的解空间内寻找使得错误率最小的阀值和偏置,这样做避免了训练若分类器的复杂性,经验证,这种方法有效。

mtaxot的博客 8023

HDU6194-string string string

string string string                                                                         Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

wang_128的博客 467

MC33PT2000控制详解一:PT2000 Dev Studio工具的使用

MC33PT2000共可控制6个高低端(如控制6个高压喷油器),1个高低端(如控制高压油泵)和DC-DC模块(如升压到65V).

m0_69929716的博客 1359

RK3588 平台imx334 驱动调试记录

rk3588调试imx334

xiaoning132的专栏 1791

HDU - 6194 string string string(后缀数组+RMQ+容斥)

题目链接:点击查看 题目大意:给出一个字符串和一个数字 k,问字符串中出现次数恰好等于 k 次的字串有多少个 题目分析:在跑完后缀数组后,我们可以用sa数组求解,具体做法是枚举起点,找长度为 k 的sa数组的最长前缀就是出现至少k次的答案了,但是不能保证所有子串恰好出现了k次,所以我们在累加答案后再减去出现至少k+1次的答案,最后因为容斥原理还需要加上一部分,因为出现k+1次,多出来的一次可以...

Falcon的博客 475

044、Edge Impulse的音频分类实战

上周调试一块STM32WBA52开发板,板载PDM麦克风死活采不到有效数据。示波器怼上去,时钟线波形漂亮得像教科书,数据线却像心电图——全是毛刺。折腾半天发现是电源纹波干扰,给麦克风单独加了个LC滤波,世界清净了。这种坑,做音频分类的嵌入式工程师迟早要踩一遍。

2401_88858637的博客 55

HDU 6194 String ACM/ICPC 2017 Shenyang Online(后缀数组+容斥原理+线段树/ST)

据说这题是另一道SPOJ的一道后缀自动机的弱化版,好腻害的样子……这里用后缀数组解。 大致题意,给你一个字符串,然后问你在这个字符串中,恰好出现k次的不同子串有多少个(可以相互重叠)。 首先明确所有后缀数组题目都很重要的一点,即所有子串都是某个后缀的前缀,大部分都可以转化为lcp的问题。然后我之前在POJ上做了一道题,没有写博客,是求一个字符串中最长的出现至少k次的子串的长度(POJ 3261)。这两道题目类似,在求至少k次的时候用的是同样的方法。 对于这个出

alpc_qleonardo 497

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HDU 6194 string string string【后缀数组】

HDU 6194 string string string【后缀数组】 2017 ACM/ICPC Asia Regional Shenyang Online Uncle Mao is a wonderful ACMER. One day he met an easy problem, but Uncle Mao was so lazy that he left the problem to you. I hope you can give him a solution. Given a string

Dust_heart的博客 771

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机

题意:给出一个字符串,求出出现了恰好k次的子串的个数。 题解:恰好k次 = 至少k次 - 至少k+1次。答案转化为求至少出现k次的子串个数统计。构造好后缀数组以及很重要的Height数组之后。用一个k-1的窗子去滑动。窗子里边放着k-1个Height值(Height[ i+1 ],Height[ i+2 ],……,Height[ i+k ]),这样k-1个值就联系了k个后缀(SA[ i ],SA

辣鸡葫芦娃 621

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HDU 6194 string string string 后缀数组+rmq

题目链接题意问一个字符串有多少个子串出现恰好 kk 次思路求出 heightheight 数组后,对于相邻的 kk 个后缀,它们包含恰好出现 kk 次的子串当且仅当 k−1k-1 个 heightheight 值中的最小值 >\gt max{max\{其中第一个与前一个的公共前缀,其中最后一个与后一个的公共前缀}\},差值即为这一段的个数。遍历一遍统计即可,最小值用 rmqrmq。注意 k=1k=1

kkkkahlua的博客 332

2017沈阳网络赛 1001 HDU 6194 string string string(后缀自动机 出现k次的子串个数)

题意:给你一个字符串,和一个k,问你字符串中恰好出现k次的子串有多少种。 思路:HDU4641的简化版,HDU4641求的是>=k次的子串个数,所以现在我们只需跑两次计算出>=k次的和>=k+1次的,两者相减即位恰好出现k次的子串个数。 具体思路参考HDU4641的就行:点击打开链接 代码: #include using namespace std; typedef

CillyB的博客 1665

string string string hdu 6194 (后缀数组做法)

string string string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 801 Accepted Submission(s): 232 Problem Description Uncle ...

weixin_30483697的博客 154

HDU - 6194 - string string string (后缀数组)

HDU-6194求出 heightheight 数组,移动一个长度为 kk 的区间。ansans 更新的值应该为 min([i+1,i+k−1])−min([i+1,i+k])−min([i,i+k−1])+min([i,i+k])min([i+1,i+k-1])-min([i+1,i+k])-min([i,i+k-1])+min([i,i+k]) 。相当于出现 kk 次的串减去出现 k+1k+1

On the way 266

HDU 6194 string string string (SAM)

Description Uncle Mao is a wonderful ACMER. One day he met an easy problem, but Uncle Mao was so lazy that he left the problem to you. I hope you can give him a solution. Given a string s, we de

小坏蛋_千千 740

HDU 6194 string string string (2017沈阳网赛-后缀数组)

题意: 告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次。 思路: 后缀数组。 我们先考虑至少出现k 次的子串, 所以我们枚举排好序的后缀i (sa[i]) 。 k段k 段的枚举。 假设当前枚举的是 sa[i]~sa[i + k -1] 那么假设这一段的最长公共前缀  是L 的话。 那么就有L 个不同的子串至少出现了k次。 我们要减去至少出现k + 1次的

aozil_yang的博客 2776

HDU-6194 string string string

求一个字符串中正好出现了K次的子串,可以用后缀自动机来做 附上后缀自动机的应用:https://blog.youkuaiyun.com/clover_hxy/article/details/68059043 以及代码出处:https://www.cnblogs.com/forever97/p/hdu6194.html 本来套了个kuangbin模板,提交结果内存爆了,因为用的都是指针(64位系统指针占用...

wl16wzl的博客 355

hdu 6194 string string string

string string string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1905    Accepted Submission(s): 567 Problem Description Uncle

但求心安的博客 343

2016 ICPC青岛赛 hdu5984 C Pocky

Pocky Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 156    Accepted Submission(s): 68 Problem Description Let’s talking about som

overload1997 2855

2017 icpc广西邀请赛 K.Query on A Tree (hdu 6191)可持久化字典树

Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Monkey A liv

overload1997 1294
上一篇: 后缀数组模板
下一篇: 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G Xor lca+暴力
overload1997
博客等级 码龄11年 328粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值