题目链接:

http://codeforces.com/contest/1248/problem/D2

题意:

可以执行一次字符交换的操作

使得操作后的字符串,循环移位并且成功匹配的方案最多

输出最多的方案数和交换的位置

数据范围:

$1\leq n \leq 300 000$

分析:

参考博客:https://www.cnblogs.com/LLTYYC/p/11718968.html

对于一个字符串,求它的循环移位匹配方案数

可以把字符串转换成折线,从0开始,遇到(则加一,遇到)则减一

如果(和)数量不同,明显答案是0,否则,答案是折线y最小值的顶点数量

可以偏移一下,使得最小值为0,那么整体折线向上偏移

如果折线归0,答案加一

那么考虑可以交换一次的情况

先对折线向上偏移

答案是1的数量或者  2的数量加不交换的答案,即,更改最小值为-1,或者增加0的数量,两种操作方案

其中区间1的数量最小值是1,区间2的数量同理

AC代码:

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int maxn=3e5+7;
int n;
char S[maxn];
int val[maxn];
int main(){
scanf("%d",&n);
scanf("%s",S+1);
int off=0,minn=1e9;
int now=0;
for(int i=1;i<=n;i++){
if(S[i]==')')now--;
else now++;
if(minn>now){
minn=now;
off=i;
}
}
if(now!=0){
printf("0\n1 1\n");
return 0;
}
int ans=0,ansl=1,ansr=1,anss=0;
for(int i=1;i<=n-1;i++){
val[i+1]=val[i];
int v=(off+i-1)%n+1;
if(S[v]==')')val[i+1]--;
else val[i+1]++;
if(val[i]==0)ans++;
//cout<<val[i]<<" ";
}
// coutMM
anss=ans;
for(int i=1;i<=n+1;i++){
if(val[i]==2){
int en=i+1,tem=1;
while(val[en]>=2){
if(val[en]==2)tem++;
en++;
}
if(tem+anss>ans){
ans=tem+anss;
ansl=(i+off-2+n)%n+1;
ansr=(en+off-2+n)%n+1;
}
i=en;
}
}
for(int i=1;i<=n+1;i++){
//cout<<val[i]<<" ";
if(val[i]==1){
int en=i+1,tem=1;
while(val[en]>=1){
if(val[en]==1)tem++;
en++;
}
if(tem>ans){
ans=tem;
ansl=(i+off-2+n)%n+1;
ansr=(en+off-2+n)%n+1;
}
i=en;
}
} printf("%d\n%d %d\n",ans,ansl,ansr);
return 0;
}

  

最新文章

  1. [算法]——归并排序(Merge Sort)
  2. 【dom4j xml】使用dom4j处理XML文件--测试过程遇到的问题
  3. Ant 学习及常用任务
  4. jpg转png
  5. [办公自动化] 再读《让EXCEL飞》(从excel导入access数据时,union联合查询,数据源中没有包含可见的表格)
  6. Ios中比较两个日期之间的时间差距
  7. 将Magento后台汉化的方法
  8. 使用 asp.net Web API 2的坑
  9. weblogic配置domain和删除domain
  10. 剪花布条(kmp)
  11. WP8关于对地图开发的改进
  12. 适合小白/外行的git与github最基础最浅显教程
  13. docker挂载NVIDIA显卡运行pytorch
  14. 高可用的MongoDB集群
  15. Centos7 下Jenkins 安装
  16. android 7.0+ FileProvider 访问隐私文件 相册、相机、安装应用的适配
  17. MySQL技巧(三)运算符与函数
  18. jQuery $.each()常见的几种使用方法
  19. 如何设置Jquery UI Menu 菜单为横向展示
  20. Python 文件内容读取

热门文章

  1. 获取ApplicationContext进而获取Ioc实例方法
  2. C# 微信消息模板 发送
  3. Nginx快速自查手册
  4. MySQL性能测试调优
  5. dvaJS Model之间的调用
  6. react-native 沉浸式状态栏
  7. Vivado cordic IP求模求角教程
  8. 【leetcode】366.Find Leaves of Binary Tree
  9. [Golang][Mac]Go 语言学习资料记录
  10. Pyspark:AssertionError: dataType should be DataType