AGC026E - Synchronized Subsequence

题目描述

Solution

定义cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]表示在前xxx个数中0的个数和1的个数分别是多少。

然后把整个串sss划分为若干个子串,划分点在所有cnt[i][0]=cnt[i][1]cnt[i][0]=cnt[i][1]cnt[i][0]=cnt[i][1]的位置iii,显然这样划分,不同的子串之间互不影响,最后合并所有子串(pickorbanpick\;\;or\;\;banpickorban)就是最终答案了。

显然这样划分子串之后,可以把子串分为两类:
1.a的前缀个数始终大于b,例如:aababb。
2.a的前缀个数始终小于b,例如:bbbaabaa。

对于第一类,字典序最大的方案即为若干个ab拼接,例如:aababb最优选择是abab。
对于第二类,答案一定是它的一个后缀。

所以对于每一个子串,我们可以在O(n2)O(n^2)O(n2)的时间内求出答案。

然后我们考虑合并答案,直接dpdpdp计算即可(我用错误的排序+特判卡过去了hhhhhhhhh)。

总时间复杂度O(n2)O(n^2)O(n2)。

以下是错误的程序:

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=6005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
char ST[MAXN>>1][MAXN],st[MAXN],ch[MAXN];
int c[MAXN],ID[MAXN],id[MAXN],cnt[2];
PR p[MAXN];
int compare(char *x,char *y)
{int lenx=strlen(x+1),leny=strlen(y+1),ans=0; bool flag=1;for (int i=3;i<=lenx;i++)if (x[i]!=x[i-2]) { flag=0; break; }for (int i=3;i<=leny;i++)if (y[i]!=y[i-2]) { flag=0; break; }if (flag){if (x[1]==y[1]&&x[2]==y[2]) return 2;}int len=max(lenx,leny);for (int i=1;i<=len;i++)if (x[i]>y[i]) return ans^1;else if (x[i]<y[i]) return ans;return 2;
}int compare(char *x,char *y,int len)
{for (int i=1;i<=len;i++)if (x[i]>y[i]) return 1;else if (x[i]<y[i]) return 0;return 2;
}
int comparec(int x,int y){ return x>y; }
void solve(int t,int l,int r)
{if (st[l]=='a'){int mx=0;for (int i=l;i<=r;i++)if (st[i]=='a'){int tmp=0;for (int j=i;j<=r;j++)if (st[j]=='a') ++tmp,j=p[id[j]].se;upmax(mx,tmp);}for (int i=1;i<=mx<<1;i+=2) ST[t][i]='a',ST[t][i+1]='b';}if (st[l]=='b'){int num=0;for (int i=l;i<=r;i++) if (st[i]=='a') c[++num]=id[i];sort(c+1,c+num+1,comparec);for (int i=1;i<=r-l+1;i++) ST[t][i]=st[i+l-1];for (int i=1;i<=num;i++){int len=0;for (int j=l;j<=r;j++)if (id[j]>=c[i]) ch[++len]=st[j];
//          cout<<ch+1<<endl;if (compare(ch,ST[t],len)==1){for (int j=1;j<=len;j++) ST[t][j]=ch[j];for (int j=len+1;j<=r-l+1;j++) ST[t][j]=NULL;}}}
//  cout<<ST[t]+1<<endl;
}
int compareid(int x,int y) { int t=compare(ST[x],ST[y]); return (t==1||t==2&&x<y); }
int main()
{//  freopen("a.in","r",stdin);
//  freopen("a.out","w",stdout);int n=read();scanf("%s",st+1);int numa=0,numb=0;for (int i=1;i<=n<<1;i++){if (st[i]=='a') p[++numa].fi=i,id[i]=numa;if (st[i]=='b') p[++numb].se=i,id[i]=numb;}int t=0;for (int i=1,lst=1;i<=n<<1;i++){cnt[st[i]-'a']++;if (cnt[0]==cnt[1]) ID[++t]=t,solve(t,lst,i),lst=i+1;}sort(ID+1,ID+t+1,compareid);
//  cout<<endl;
//  for (int i=1;i<=t;i++) cout<<ST[i]+1<<" "<<ID[i]<<endl;int smax=0;for (int i=1;i<=t;i++)if (ID[i]>smax) printf("%s",ST[ID[i]]+1),smax=ID[i]; return 0;
}
/*
10
ba ab ba ba bbabbbaaaa ab20
ba ab bbabaa bbbabbabbabbaaaaaa aabb aabababb
*/ 

AGC026E - Synchronized Subsequence相关推荐

  1. 【java线程】锁机制:synchronized、Lock、Condition

    [Java线程]锁机制:synchronized.Lock.Condition 原创 2013年08月14日 17:15:55 标签:Java /多线程 74967 http://www.infoq. ...

  2. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  3. java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

    作者:七里香的编程之路 出自:OSCHINA 原文:my.oschina.net/u/4098550/blog/4548274 能保证可见性的措施 除了volatile 可以让变量保证可见性外.hap ...

  4. UVALive2678:Subsequence

    UVALive2678:Subsequence 题目大意 给定一个数组A和一个整数S.求数组A中,连续且之和不小于S的连续子序列长度最小值. 要求复杂度:Ο(n) Solution 用变量L表示所选区 ...

  5. 你真的掌握了并发编程volatile synchronized么?

    先看代码: import java.util.concurrent.atomic.AtomicInteger;/**** @author xialuomantian*/ public class Ne ...

  6. Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现

    关于怎么查看字节码的五种方法参考本人另一篇文章<Java以及IDEA下查看字节码的五种方法> 查看汇编语言汇编码 说要看汇编还是很有必要的,因为有些地方比如加锁其实还是通过汇编实现的,只看 ...

  7. java并发vol_java 并发中 volitile、synchronized和lock的比较(一)

    1.volitile和(synchronnized.lock) 首先比较volitile和synchronnized,volitile线程不安全,但是synchronized则是线程安全的. voli ...

  8. synchronized底层原理_你用过synchronized吗?它的底层原理是什么?Java经典面试题来了...

    并发编程已经成为程序员必备技能 作为Java程序员,不懂得并发编程显然已经不能满足市场需求了,尤其是在面试过程中将处于被动地位,也有可能面试将就此终结. 那么作为Java开发者的你,日常虽然可以基于J ...

  9. swift Sequence 和 SubSequence

    1 序列 Sequence 序列协议是集合类型结构中的基础. 一个序列是代表有一系列具有相同类型的值,并且对这些值进行迭代. 协议中主要有两个参数,一个是元素Element,一个就是迭代器Iterat ...

最新文章

  1. python从入门到精通学习笔记_Python从入门到精通之基础概念
  2. java 鉴权_我爱java系列之---【JWT实现微服务鉴权(一)】
  3. winform响应时间最长是多少分钟_了解这个,你的爬升勋章分分钟手到擒来!
  4. 关于jQuery获取html标签自定义属性值或data值
  5. Python——数组(列表)的基本操作
  6. R语言与非参数统计(核密度估计)
  7. 呕心编写的《金牌网管师——金牌网吧网管》
  8. access中本年度的四月一日_吉林十二中古时孔夫子栽银杏设坛讲学 今日十二中植银杏校园生辉...
  9. 笔记本电脑散热风扇声音比较大解决方法
  10. 浅谈信息安全等级保护与ISO27000系列标准的异同
  11. 谷歌浏览器怎么拦截网页广告 5步解决广告困扰
  12. 开始CentOS世界 从yum搭建lnmp环境开始,root的密码破解,定时任务, 后续其他功能 redHat5.4
  13. 高级测试简历借鉴--深圳0803
  14. Python判断时间
  15. 图像旋转源程序c语言,图像旋转 - 红尘潇洒,独自前行,但尽人事,莫问前程 - OSCHINA - 中文开源技术交流社区...
  16. 树莓派python3的opencv下载(编译失败第六步必看)
  17. Java~二叉树的前中后序遍历的几种方式(递归法,迭代法,标记法等)
  18. RISC-V架构的开源处理器分析
  19. 趣味Python | 223 段代码助你从入门到大师
  20. Windows刷新dns缓存

热门文章

  1. 人生没有对与错,只是选择不同
  2. 如此生猛的纪录片,背后是难以置信的故事!
  3. 如何优雅的当海王……
  4. 长能耐了?想造反了?你老婆没了.......
  5. 如何用数学方法估算一个女生前男友的数量?
  6. docker 查看容器_Docker介绍
  7. linux中断处理汇编入口,Linux中断处理体系结构分析(一)
  8. java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
  9. Mysql存储过程名规则_sql 存储过程命名规范
  10. python笔试题 github_简单的python面试题,居然