GPLT L1-110 这不是字符串题
题目编号
L1-110(这不是字符串题)
题目内容
小特需要对一个正整数序列进行 M 次操作,操作类型包括:
- 查找替换:查找连续子序列并替换为指定序列(仅替换第一个匹配项)。
- 插入平均数:在相邻和为偶数的数字间插入平均数。
- 区间翻转:翻转指定区间内的子序列。
最终输出操作后的序列。
输入格式
- 第一行输入两个正整数
N, M
(1 ≤ N, M ≤ 10³),表示初始序列长度和操作次数。- 第二行输入
N
个正整数A_i
(1 ≤ A_i ≤ 26),表示初始序列。- 后续
M
部分为操作描述:
- 操作1:
- 第二行输入L1
和L1
个正整数,表示需查找的序列。
- 第三行输入L2
和L2
个正整数,表示替换后的序列。- 操作2:无额外输入。
- 操作3:第二行输入两个正整数
l, r
(1 ≤ l ≤ r ≤ 当前序列长度),表示需翻转的区间。
输出格式
输出最终序列,数字间用空格分隔,末尾无多余空格。
输入样例
39 5
14 9 2 21 8 21 9 10 21 5 4 5 26 8 5 26 8 5 14 4 5 2 21 19 8 9 26 9 6 21 3 8 21 1 14 20 9 2 1
1
3 26 8 5
2 14 1
3
37 38
1
11 26 9 6 21 3 8 21 1 14 20 9
14 1 2 3 4 5 6 7 8 9 10 11 12 13 14
2
3
2 40
输出样例
14 9 8 7 6 5 4 3 2 1 5 9 8 19 20 21 2 5 4 9 14 5 8 17 26 1 14 5 4 5 13 21 10 9 15 21 8 21 2 9 10 11 12 13 14 1 2
样例解释
操作步骤中间结果(详见题目描述)。
代码限制
- Java:时间限制 1100 ms,内存限制 512 MB。
- 其他语言:时间限制 400 ms,内存限制 64 MB,栈限制 8192 KB。
- 代码长度:≤ 16 KB。
来源
杭州百腾教育科技有限公司 · 作者:DAI, Longao
注:题目保证操作过程中序列长度不超过 100N
。
AC code
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int find(const vector<int>&a,const vector<int>&b){
vector<int>st;
if(b.empty()) return -1;
for(int i=1;i<a.size();i++){
if(a[i]==b[1]) st.push_back(i);
}
for(int i=0;i<st.size();i++){
int s=st[i];
bool f(0);
for(int j=s;j<s+b.size()-1;j++){
if(a[j]!=b[j-s+1]) f=1;
}
if(!f) return s;
}
return -1;
}
int main(){
cin.tie(0)->ios::sync_with_stdio(false);
int n,m;cin>>n>>m;
vector<int>a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1,op;i<=m;i++){
cin>>op;
if(op==1){
int n1,n2;
cin>>n1;
vector<int>a1(n1+1);
for(int i=1;i<=n1;i++) cin>>a1[i];
cin>>n2;
vector<int>a2(n2+1);
for(int i=1;i<=n2;i++) cin>>a2[i];
int pos=find(a,a1);
if(pos==-1) continue;
vector<int>pre,suf;
vector<int>resa;
for(int i=1;i<pos;i++) pre.push_back(a[i]);
for(int i=pos+a1.size()-1;i<a.size();i++) suf.push_back(a[i]);
for(int i=0;i<pre.size();i++) resa.push_back(pre[i]);
for(int i=1;i<=n2;i++) resa.push_back(a2[i]);
for(int i=0;i<suf.size();i++) resa.push_back(suf[i]);
n=resa.size();
resa.insert(resa.begin(),0);
a=resa;
}
else if(op==2){
for(int i=1;i<=n-1;i++){
if((a[i]+a[i+1])%2==0){
int num=(a[i]+a[i+1])/2;
a.insert(a.begin()+i+1,num);
i++;
n++;
}
}
}
else if(op==3){
int l,r;cin>>l>>r;
if(l^r) reverse(a.begin()+l,a.begin()+r+1);
}
}
for(int i=1;i<=n;i++) cout<<a[i]<<" \n"[i==n];
return 0;
}
/*
赛时为此浪费一小时debug QWQ
*/