[CF873F]Forbidden Indices

2024-03-16 23:18
文章标签 forbidden indices cf873f

本文主要是介绍[CF873F]Forbidden Indices,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Forbidden Indices

题解

其实是蛮简单的一道题。

首先我们应该很容易想到后缀数组,我们可以通过LCP来求出子串的出现次数。于是,就先跑一遍后缀数组。
此时,我们就得到了相邻两个串的 h i h_{i} hi,由于后缀 s i s_{i} si与后缀 s j s_{j} sj之间的相同前缀是等于他们之间的所有 h h h的最小值的,我们很容易想到滑动窗口。
我们可以通过单调栈来求出最后的答案,将它可以到达的左右边界求出来。
注意到它还有一个禁止某一位的要求,我们可以先将整个串反过来,此时答案是不会变的。条件从某一位停止就变成禁止从某一位开始了。此时将所有的被禁止的起点给删掉,再跑单调栈即可。

时间复杂度 O ( ( 26 + l o g n ) n ) O\left((26+log_{n})n \right) O((26+logn)n)

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define MAXN 200005
typedef long long LL;
#define int LL
const LL INF=0x7f7f7f7f7f7f7f7f;
typedef pair<int,int> pii;
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while('0'>s||'9'<s){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
} 
char str[MAXN];
int n,x[MAXN],y[MAXN],c[MAXN],z[MAXN],m,sta[MAXN],stak,minn;LL ans;
int sa[MAXN],rk[MAXN],hei[MAXN],ban[MAXN],L[MAXN],R[MAXN],hh[MAXN],cur;
void getSa(){for(int i=1;i<=n;i++)c[x[i]=str[i]-'a'+1]++;for(int i=2;i<=m;i++)c[i]+=c[i-1];for(int i=n;i>0;i--)sa[c[x[i]]--]=i;//for(int i=1;i<=n;i++)printf("%d ",sa[i]);puts("");for(int k=1;k<=n;k<<=1){int num=0;for(int i=n-k+1;i<=n;i++)y[++num]=i;for(int i=1;i<=n;i++)if(sa[i]>k)y[++num]=sa[i]-k;for(int i=1;i<=m;i++)c[i]=0;for(int i=1;i<=n;i++)c[z[i]=x[i]]++;for(int i=2;i<=m;i++)c[i]+=c[i-1];for(int i=n;i>0;i--)sa[c[x[y[i]]]--]=y[i];for(int i=1;i<=n;i++)x[i]=y[i]=0;x[sa[1]]=num=1;for(int i=2;i<=n;i++)x[sa[i]]=(z[sa[i]]==z[sa[i-1]]&&z[sa[i]+k]==z[sa[i-1]+k])?num:++num;//for(int i=1;i<=n;i++)printf("%d ",sa[i]);puts("");m=num;if(num==n)break;}
}
void getHi(){int k=0;for(int i=1;i<=n;i++)rk[sa[i]]=i;for(int i=1;i<=n;i++){if(k)k--;int j=sa[rk[i]-1];while(i+k<=n&&j+k<=n&&str[i+k]==str[j+k])k++;hei[rk[i]]=k;}//for(int i=1;i<=n;i++)printf("%d\n",hei[i]);
} 
signed main(){read(n);scanf("\n%s",str+1);m=26;getSa();getHi();for(int i=n;i>0;i--)scanf("%1lld",&ban[i]);ban[0]=1;for(int i=1;i<=n;i++){if(!ban[sa[i]])ans=max(ans,1ll*(n-sa[i]+1));if(ban[sa[i]])minn=min(minn,hei[i]);else if(!ban[sa[i]]&&ban[sa[i-1]])hh[++cur]=min(minn,hei[i]),minn=INF;else hh[++cur]=hei[i];}for(int i=1;i<=cur;i++){while(stak&&hh[sta[stak]]>=hh[i])R[sta[stak--]]=i;L[i]=stak?sta[stak]:1;sta[++stak]=i;}while(stak)R[sta[stak--]]=cur+1;for(int i=1;i<=cur;i++)ans=max(ans,1ll*hh[i]*(R[i]-L[i]));printf("%lld\n",ans);return 0;
}

谢谢

这篇关于[CF873F]Forbidden Indices的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817060

相关文章

接口报错403 Forbidden 【已解决】

接口报错403 Forbidden 【已解决】 在Web开发中,接口请求错误是开发者经常遇到的问题之一。其中,403 Forbidden错误尤为常见,它表明服务器理解了客户端的请求,但是拒绝执行此请求。本文将深入探讨接口请求403 Forbidden错误,从常见报错问题、解决思路、解决方法、常见场景分析,到扩展与高级技巧,为你提供一份全面的实战指南。

Dominant Indices【模板】长链剖分

~~~~~      Dominant Indices ~~~~~      总题单链接 对比重链剖分和长链剖分 ~~~~~      什么是重链剖分:根据子树的大小将树拆成多条互不相交的链。 ~~~~~      什么是长链剖分:根据字数的深度将树拆成多条互不相交的链。 ~~~~~      重链剖分中的重儿子:子树大小最大的儿子。 ~~~~~      长链剖分中的重儿子:

ElasticSearch6 报错blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];

原文链接:https://www.cnblogs.com/zhja/p/9717536.html blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]; 官方解决方法: curl -XPUT -H "Content-Type: application/json" http://127.0.0.1:9200/_all/_

fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden的解决方案

零、实验报告地址 计算机视觉实验二:基于支持向量机和随机森林的分类(Part one: 编程实现基于支持向量机的人脸识别分类 )-CSDN博客 一、代码报错         fetch_lfw_people()报错urllib.error.HTTPError: HTTP Error 403: Forbidden 二、报错原因         通常是由于访问权限不足导致的,fetch_

nginx 403 forbidden 二种原因

想必大家在用nginx 多少都会遇到这个问题nginx 403 forbidden ..... 加上nginx的版本 引起nginx 403 forbidden有二种原因,今天又遇到了,总结一下 1.缺少index.html index.php文件. 在项目下面/var/www/xxx项目下面没有存在index.html或者index.php,直接访问域名,找不到文件会报403 forbid

hdu3987 Harry Potter and the Forbidden Forest 最小割割边最少

题意:给一个n个点构成的有向图,起点为0,终点为n-1。每条边有一个权值,删除一条边的代价为边权。问如何删除使得0和n-1不 联通且代价最小,在这种情况下至少要删除多少条边。 思路:首先保证代价最小,很容易想到是最小割,但是不知怎么保证割边最少= =看了大神博客。。恍然大悟。。模型真是见得 少。。我们设一个较大的值N(N>数据给的最大边数),将边权变成w*N+1,那么最后求得的最大流对N取

Django Forbidden (CSRF cookie not set.)解决办法

解决办法就是在setting.py文件中注释: 'django.middleware.csrf.CsrfViewMiddleware', 这个中间件是为了防止跨站请求伪造的,平时用网页表单请求时,post提交是没有问题的,但是用api调用时就会被禁止,为了能使用接口调用post请求,就只能停用该插件了。

【python报错】list indices must be integers or slices, not tuple

【Python报错】list indices must be integers or slices, not tuple 在Python中,列表(list)是一种常用的数据结构,用于存储一系列的元素。当你尝试使用不支持的索引类型访问列表元素时,会遇到list indices must be integers or slices, not tuple的错误。这个错误表明你尝试使用了一个元组

Pytorch中“RuntimeError: Input, output and indices must be on the current device“问题解决

问题描述 昨天跟着一篇博客BERT 的 PyTorch 实现从头写了一下BERT的代码,因为原代码是在CPU上运行的,于是就想将模型和数据放到GPU上来跑,会快一点。结果,在将输入数据和模型都放到cuda上之后,仍然提示报错: "RuntimeError: Input, output and indices must be on the current device" 原因与解决方法 通

【python】成功解决“TypeError: string indices must be integers”错误的全面指南

成功解决“TypeError: string indices must be integers”错误的全面指南 一、引言 在Python编程中,TypeError: string indices must be integers错误是一个常见的错误,它通常发生在尝试使用非整数类型(如字符串或浮点数)作为索引来访问字符串中的字符时。这个错误通常是由于对字符串和字典的索引操作混淆或者对字符串的