Non Super Boring Substring 题解(hash+思维)
题目链接
题目大意
给你一个长度为d(d<=1e5)的字符串,要你求有多少个子串满足这个子串不包含长度大于等于k的回文子串
题目思路
首先可以hash预处理,然后O(1)用前缀hash值和后缀hash值求一个字符串是否是回文串
其实你只要枚举每个点当作左端点,求右端点最远能到那里即可
回文串可能最多达到\(n^2\)个,但你可以思考一下其实你只要考虑长度为k和k+1的字符串即可
具体证明有点麻烦自己可以画图去考虑一下,因为长度更长的回文串必有子串长度为k或k+1
但是长度更短的回文串,影响明显是比长度更大的回文串大,即可以使得左端点固定,右端点更左
然后把所有长度为k或者k+1的回文串,先按右端点,然后按左端点排序
用双指针的思想求出每个点当作左端点,可以到达的最远右端点
代码
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=2017;
const double eps=1e-10;
int k;
char s[maxn];
int d;
ull base[maxn],pre[maxn],suf[maxn];
pair<int,int> pa[maxn];
void init(){
base[0]=1;
for(int i=1;i<=d;i++){
base[i]=base[i-1]*29;
}
for(int i=1;i<=d;i++){
pre[i]=pre[i-1]*29+s[i]-'a'+1;
}
for(int i=d;i>=1;i--){
suf[i]=suf[i+1]*29+s[i]-'a'+1;
}
}
ll getprehash(int l,int r){
return pre[r]-pre[l-1]*base[r-l+1];
}
ll getsufhash(int l,int r){
return suf[l]-suf[r+1]*base[r-l+1];
}
int main(){
int _;scanf("%d",&_);
while(_--){
scanf("%d %s",&k,s+1);
d=strlen(s+1);
init();
int cnt=0;
for(int i=1;i+k-1<=d;i++){
if(getprehash(i,i+k-1)==getsufhash(i,i+k-1)){
pa[++cnt]={i+k-1,i};
}
}
for(int i=1;i+k+1-1<=d;i++){
if(getprehash(i,i+k)==getsufhash(i,i+k)){
pa[++cnt]={i+k,i};
}
}
sort(pa+1,pa+1+cnt);
int now=1;
ll ans=0;
for(int i=1;i<=d;i++){
while(pa[now].se<i&&now<=cnt){
now++;
}
if(now==cnt+1){
ans+=d-i+1;
}else{
ans+=pa[now].fi-1-i+1;
}
}
printf("%lld\n",ans);
}
return 0;
}
Non Super Boring Substring 题解(hash+思维)的更多相关文章
- LeetCode longest substring without repeating characters 题解 Hash表
题目 Given a string, find the length of the longest substring without repeating characters. Example 1: ...
- COGS 902 乐曲主题 题解 & hash入门贺
[题意] 给定一个长为n的序列,元素都是不超过88的正整数,求序列中主题的最大长度. 所谓主题是指在序列中出现了至少两次并且不相交的子串.特别的,主题可以变调,也就是说如果一个子串全部加上或减去一个数 ...
- [LeetCode]Longest Palindromic Substring题解(动态规划)
Longest Palindromic Substring: Given a string s, find the longest palindromic substring in s. You ma ...
- Codeforces Round #579 (Div. 3) D2. Remove the Substring (hard version) (思维,贪心)
题意:给你一个模式串\(t\),现在要在主串\(s\)中删除多个子串,使得得到的\(s\)的子序列依然包含\(t\),问能删除的最长子串长度. 题解:首先,我们不难想到,我们可以选择\(s\)头部到最 ...
- CF1433A Boring Apartments 题解
Content 我们把仅由一个或多个相同的数位组成的数字叫作"无聊的数字".我们把 \(\leqslant 10000\) 的这种数字按照以下规则排列: 首先,将仅由 \(1\) ...
- Find the Maximum - 题解【思维,贪心】
题面 这是2022年ICPC昆明站的F题.在赛场上,我一开始敲了个贪心,但是出锅了,改敲树形DP,但是时间来不及了.在队友的提醒下补过了这个题,知道解法的我发现我就是个纯纯的老坛-- 原题链接在牛客网 ...
- [NOIP2015] 子串substring 题解
[题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...
- BZOJ2555:SubString——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2555 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作 ...
- 牛客练习赛16 B 漂亮的树【哈希hash/思维】
链接:https://www.nowcoder.com/acm/contest/84/B 来源:牛客网 题目描述 街上有n棵树,标号为1...n,第i棵树的高度为ai. 定义这n棵树是漂亮的,当且仅当 ...
随机推荐
- 重要,知识点:InnoDB的插入缓冲
世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性: 插入缓冲(Insert Buffer) 两次写(Do ...
- Spring MVC json配置
接口类的Controller,一般返回的是json数据,而Spring MVC中默认返回的string,而jsp页面的话,会按配置中自己行匹配转义字符串为对应的jsp文件. @Controller @ ...
- 云计算管理平台之OpenStack网络服务neutron
一.简介 neutron的主要作用是在openstack中为启动虚拟机实例提供网络服务,对于neutron来讲,它可以提供两种类型的网络:第一种是provider network,这种网络就是我们常说 ...
- 自动化运维Ansible-01-安装及简单的使用
实验环境:Centos 7.x Ansible版本:ansible 2.9.13 服务端的操作 1.系统默认的yum仓库中没有找到ansible,这里我们先安装epel源(需要用到CentOS-Bas ...
- Java学习的第二十二天
1.异常处理 try...catch...finally... finally带return finally也可省略 try里面可以有try 多个异常用IllegalAgruementExceptio ...
- python实现有趣的数学逻辑程序
1.无重复数字的三位数 题目:有1.2.3.4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少? for i in range(1,5): for j in range(1,5): fo ...
- python面向对象(类与对象)
面向对象思想 关注公众号"轻松学编程"了解更多. 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在生活中: 它是一种看待问 ...
- [Luogu P2891/POJ 3281/USACO07OPEN ]吃饭Dining
传送门:https://www.luogu.org/problemnew/show/P2891 题面 \ Solution 网络流 先引用一句真理:网络流最重要的就是建模 今天这道题让我深有体会 首先 ...
- 获取List集合对象中某一列属性值
例:获取disposeList集合中CorpusMarkPage对象中的responseId属性,生成新的List集合 List<String> responseIdList = disp ...
- c#mysql数据库
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...