循环移动(cyclic)
问题描述
给出一个字符串S与N个操作。每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K次。一次循环移动就是将字符串最后的这个字符移动到第一位,其余的字符顺次后移。
例如,对于字符串abacaba,操作(L=3, R=6, K=1)后得到的字符串即为abbacaa。
求出在N个操作后得到的字符串。
输入格式(cyclic.in)
第一行一个字符串S。
第二行一个整数N,代表操作的总数。
接下来N行每行三个数L,R,K,每行代表一个操作。
输出格式(cyclic.out)
一行一个字符串,代表N个操作后的字符串。
样例输入
abbacaa
2
3 6 1
1 4 2
样例输出
ababaca
数据范围与约束
设|S|为字符串S的长度。
对于30%的数据,|S|<=100, N<=100, K<=100
对于100%的数据,|S|<=10000, N<=300, K<=1000,000,1<=L<=R<=|S|
这个题一开始我看到数据范围想到了链表,调了好长时间才调过去ToT,后来才发现复杂度原来不是O(n*s),而是直接模拟的O(3*n*s)!更糟糕的是,人家直接模拟的比我好不容易调出来的链表快啊!ToT
先贴一下链表的代码:
#include<iostream>//链表(代码好恶心)
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
#include<string>
using namespace std;
char s[10009];
struct H{int f,t;
}b[10009];
int len,n;
int main()
{freopen("cyclic.in","r",stdin);freopen("cyclic.out","w",stdout);gets(s+1);len=strlen(s+1);scanf("%d",&n);for(int i=1;i<=len;i++){b[i].f=i-1;b[i].t=i+1;}for(int i=1;i<=n;i++){int l,r,k;scanf("%d%d%d",&l,&r,&k);k=k%(r-l+1);int x;if(k){for(x=1;b[x].f;x++);int l1,r1,k1,k2;for(int j=1;j<=r;j++){if(j==l) l1=x;if(j==r) r1=x;if(j==r-k) k1=x;if(j==r-k+1) k2=x;x=b[x].t;}//注意细节:-( b[b[r1].t].f=k1;b[k2].f=b[l1].f;b[b[l1].f].t=k2;b[k1].t=b[r1].t;b[r1].t=l1;b[l1].f=r1;}}int x;for(x=1;b[x].f;x++);printf("%c",s[x]);for(int i=1;i<=len-1;i++){printf("%c",s[b[x].t]);x=b[x].t;}return 0;
}
直接模拟:
#include<iostream>//直接模拟O(3*n*s) ,正好八次方嘛!
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
char s[10009],b[10009];
int n;
int main()
{freopen("cyclic.in","r",stdin);freopen("cyclic.out","w",stdout);cin>>s+1;scanf("%d",&n);for(int i=1;i<=n;i++){int l,r,k;scanf("%d%d%d",&l,&r,&k);k%=(r-l+1);int t=0;for(int j=l;j<=(r-k);j++){b[++t]=s[j];}int p=r-k;for(int j=l;j<=(l+k);j++){s[j]=s[++p];}for(int j=1;j<=t;j++){s[l+k+j-1]=b[j];}}cout<<s+1;return 0;
}
转载于:https://www.cnblogs.com/dfsac/p/7587879.html
循环移动(cyclic)相关推荐
- 用计算机模拟人类循环,半模拟循环计算,cyclic computation with semi-simulation,音标,读音,翻译,英文例句,英语词典...
补充资料:材料设计中的计算机模拟 材料设计中的计算机模拟 computer simulation for materials design 材料设计中的计算机模拟computer siinulatio ...
- OFDM中保护间隔与循环前缀抵抗ISI…
主要参考文档:OFDM移动通信技术原理与应用 目录 一.符号间干扰ISI 与 信道间干扰ICI 的概念 二.保护间隔 减少 ISI 三.循环前缀 减少 ICI 四.保护间隔与循环前缀 加入后的OFDM ...
- 软件测试循环测试原理,电化学测试(三):循环伏安法详解
循环伏安法是一种很有用的电化学研究方法,可用于电极反应的性质.机理和电极过程动力学参数的研究.对于一个新的电化学体系,首选的研究方法往往是循环伏安法.由于受影响因素较多,该法一般用于定性分析,很少用于 ...
- LTE CRS 时频资源
1. 参考 Spec 3GPP-36.211-6.10 Cell-specificReference Signal (CRS) Cell-specificreference signals are t ...
- arduino 呼吸灯_如何改善您的Arduino呼吸机:用于临时COVID-19呼吸机设计的RTS和SCS简介...
arduino 呼吸灯 The world as we know it was recently taken by storm. That storm was the outbreak of the ...
- python时间序列指数平滑预测_时间序列分析预测实战之指数平滑法
一.什么是时间序列分析? 在工作中,常常要对数据进行预测,确定业务未来的发展趋势,进而配置相关的营销策略.制定业务目标,由此引申出了一个重要的用数据预测未来的方法--时间序列分析,今天和大家分享就是实 ...
- 机器学习笔记(时间序列):不同类型的图示
1 时间图 time-plot 就是最普通的绘制一张随时间变化的连点图.不过在这一张图中,可能会有时间序列的不同属性:趋势.季节性.周期性 1.0 R语言补充:设置时间序列 y <- ts(c( ...
- 常见.Net 英文专业词汇收集
转自:http://www.ninedns.com/asp.net/2007102514949.html abstract class 抽象类 accelerator 快捷键 accele ...
- 浅谈JavaScript、ES5、ES6
什么是JavaScript JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能.(好吧,概念什么最讨厌了) 动态: 在运行时确定数据类型.变量使用之前不 ...
- HBase数据备份及恢复(导入导出)的常用方法
一.说明 随着HBase在重要的商业系统中应用的大量增加,许多企业需要通过对它们的HBase集群建立健壮的备份和故障恢复机制来保证它们的企业(数据)资产.备份Hbase时的难点是其待备份的数据集可能非 ...
最新文章
- 【PHP】curl_init() 如何排错????
- 硅谷增长的新指标——超级用户微笑曲线
- VC小技巧汇总之对话框技巧
- Android复习14【高级编程:推荐网址、抠图片上的某一角下来、Bitmap引起的OOM问题、三个绘图工具类详解、画线条、Canvas API详解(平移、旋转、缩放、倾斜)、矩阵详解】
- HarmonyOS之AI能力·分词
- 【Linux】一步一步学Linux——lsattr命令(116)
- 天津市电子计算机职业学院,天津市电子计算机职业中等专业学校
- 设置div的高度_html中如何让div居中
- 详解3种常用数据分析方法,满足你职场95%的高频需求
- Swift---TextView用法
- 转 疯狂代码 大型网站架构系列(未完待续)
- 高等代数100道题及答案解析
- EMNLP-21-Exploring Task Difficulty for Few-Shot Relation Extraction
- 四足机器人--嵌入式硬件设计
- sn0int - 半自动化 OSINT 框架和包管理器
- 牛客寒假算法基础训练营3 G.糖果
- MySQL操作数据库语法及常见MySQL面试题与答案
- MATLAB--数值计算(矩阵)
- java浅显易懂解释return相关
- To My Little Princess