SNOI 2019 字符串
SNOI 2019 字符串
题解:
解法一:
记一个数组\(f\),\(f[i]=\min_j\ s[j]\neq s[j+1] (j\geq i)\),直接sort即可,复杂度\(O(nlogn)\)
#include<bits/stdc++.h>
using namespace std;
namespace Tzh{
const int maxn=1000010;
int f[maxn],rank[maxn],n; char s[maxn];
bool cm(int a,int b){
int x=a,y=b,flag=0;
if(x>y) swap(x,y),flag=1;
if(f[x]>=y) return 1^flag;
else return (s[f[x]]>s[f[x]+1])^flag;
}
void work(){
cin>>n; cin>>s+1; f[n]=n;
for(int i=n-1;i;i--)
if(s[i]!=s[i+1]) f[i]=i;
else f[i]=f[i+1];
for(int i=1;i<=n;i++) rank[i]=i;
sort(rank+1,rank+n+1,cm);
for(int i=1;i<=n;i++) cout<<rank[i]<<" ";
return ;
}
}
int main(){
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
ios::sync_with_stdio(false);
Tzh::work();
return 0;
}
解法二
将字符串相同的字符先缩起来,现在字符串相邻两个字符不同.
将字符串分成若干段严格上升的子段,将每个字段的末尾成为1位置,其他成为2位置。
即对于每个1位置\(i\)都有\(s[i]>s[i+1]\),对于每个2位置\(i\)都有\(s[i]<s[i+1]\)
对于两个删1位置的串比较,前面的小
对于两个删2位置的串比较,后面的小
对于一个删1,一个删2的串,删1的小
所以先把1位置的输出,剩下的倒序输出即可
复杂度\(O(n)\)
#include<bits/stdc++.h>
using namespace std;
namespace Tzh{
const int maxn=1000010;
int n,top,st[maxn],last; char s[maxn];
void work(){
cin>>n>>s+1;
for(int i=1;i<=n;i++){
if(s[i]==s[i+1]&&!last) last=i;
else if(s[i]>s[i+1]){
if(!last) last=i;
for(int j=last;j<=i;j++) cout<<j<<" ";
last=0;
}
else if(s[i]<s[i+1]){
if(!last) last=i;
for(int j=i;j>=last;j--) st[++top]=j;
last=0;
}
}
for(int i=top;i;i--) cout<<st[i]<<" ";
return ;
}
}
int main(){
Tzh::work();
return 0;
}
SNOI 2019 字符串的更多相关文章
- [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增
题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...
- 【BZOJ5496】[十二省联考2019]字符串问题(后缀树)
[BZOJ5496][十二省联考2019]字符串问题(后缀树) 题面 BZOJ 洛谷 题解 首先显然可以把具有支配关系的串从\(A\)到\(B\)连一条有向边,如果\(B_i\)是\(A_j\)的前缀 ...
- Luogu P5284 [十二省联考2019]字符串问题
好难写的字符串+数据结构问题,写+调了一下午的说 首先理解题意后我们对问题进行转化,对于每个字符串我们用一个点来代表它们,其中\(A\)类串的点权为它们的长度,\(B\)类串的权值为\(0\) 这样我 ...
- P5284 [十二省联考2019]字符串问题
这是一道涵盖了字符串.图论.数据结构三个方面的综合大题. 把这道题放在D1T2的人应该拖出去打 前置芝士 首先,您至少要会topsort. 其次,如果您只想拿个暴力分,字符串Hash就足够了:如果您想 ...
- 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]
传送门 思路 设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度. 然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建 ...
- [LOJ3049] [十二省联考 2019] 字符串问题
题目链接 LOJ:https://loj.ac/problem/3049 洛谷:https://www.luogu.org/problemnew/show/P5284 BZOJ:https://www ...
- LOJ3049 [十二省联考2019] 字符串问题 【后缀自动机】【倍增】【拓扑排序】
题目分析: 建出后缀自动机,然后把A串用倍增定位到后缀自动机上,再把B串用倍增定位到后缀自动机上. SAM上每个点上的A串根据长度从小到大排序,建点,依次连边. 再对于SAM上面每个点,连到儿子的边, ...
- 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)
LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...
- 【题解】Luogu P5284 [十二省联考2019]字符串问题
原题传送门 我用sa做的本题 (码量似乎有点大) 先对原串建sa 考虑如何建图: 从大到小枚举长度len 先将height中等于len的两个位置在并查集合并起来,将lst也合并(lst是链表) 再将长 ...
随机推荐
- .net基础系列
这里汇总了.net基础的相关文章,方便查阅! .net基础 委托(1)认识委托 委托(2).net 1.x中的委托 委托(3).net 2.0中的委托 委托(4).net 3.5中的委托 委托(5)委 ...
- JavaScript 是如何工作的:JavaScript 的内存模型
摘要: 从内存角度理解 let 和 const 的意义. 原文:JavaScript 是如何工作的:JavaScript 的内存模型 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这 ...
- JavaScript学习一之数据校验
JavaScript页面进行数据校验 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- Spring+MyBatis整合过程
步骤: 1.引入Spring+MyBatis开发包 >spring(ioc aop dao)开发包 >mybatis开发包,dbcp,驱动包 >mybatis-spring.jar整 ...
- xml代码 解决eclipse乱码问题
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springf ...
- MongoDB学习(查找文档和其他数据查找操作)
理解Cursor对象和查询运算符 cursor对象 cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象. 在使用 find() 方法查询时,返回的并非实际文档,而是一 ...
- MySQL-每日定点运行
最近做项目的时候设计每天定点执行的脚本,所以在这 马克一下,方便查找 set time_zone = '+8:00'; set GLOBAL event_scheduler = 1; ...
- [总结]CSS/CSS3常用样式与web移动端资源
CSS/CSS3常用样式与知识点 IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法.条 ...
- Skyline基本操作模式封装
skyline基本操作模式 项目中基于skyline的浏览器插件进行二次开发,基本的业务操作模式如下: 工具栏:点击工具栏某个功能,开启操作模式. onFrame:鼠标移动预选对象,在能够拾取或者选定 ...
- vivo7.0以上系统如何无需Root激活Xposed框架的方法
在较多公司的引流或者业务操作中,基本都需要使用安卓的黑高科技术Xposed框架,几天前我们公司购买了一批新的vivo7.0以上系统,基本都都是基于7.0以上版本,基本都不能够获取Root的su超级权限 ...