FilePath CodeGMOJContest20230810 UpGroup BT1 U R TOO LAZY DUDET1 U R TOO LAZY DUDEcpp Date 2023-08-10 080233 LastEditTime 2023-08-10 144359 Author HuajiCCCP QAQ qwq awa TT T^T wEEEEEEEEEEEEEEEEEE
为了优化时间,可以使用双指针的方法来遍历字符串。定义两个指针i和j,初始时i指向字符串的第一个字符,j指向字符串的最后一个字符。然后比较a[i]和a[j]的大小,如果a[i]大于a[j],则将a[j]加入到答案数组中,j指针向前移动一位;如果a[i]小于a[j],则将a[i]加入到答案数组中,i指针向后移动一位;如果a[i]等于a[j],则需要进一步判断。定义两个指针i1和j1,分别指向a[i]后面的字符和a[j]前面的字符。如果a[i1]小于a[j1],则将a[i]加入到答案数组中,i指针向后移动一位;如果a[i1]大于a[j1],则将a[j]加入到答案数组中,j指针向前移动一位;如果a[i1]等于a[j1],则继续比较下一个字符,直到找到不相等的字符为止。重复上述步骤,直到i大于等于j为止。最后输出答案数组即可。
优化后的代码如下:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
bool flag=true;
int n,cnt;
char a[114514],ans[114514];
void input(){
scanf("%d\n",&n);
for(int i=1;i<=n;i++){
a[i]=getchar();
getchar();
if(i!=1 && a[i]!=a[i-1]) flag=false;
}
}
void run(){
for(int i=1,j=n;i<=j;){
if(a[i]>a[j])
ans[++cnt]=a[j--];
else if(a[i]<a[j])
ans[++cnt]=a[i++];
else{
ans[++cnt]=a[i];
int i1=i,j1=j;
while(true){
if(a[i1+1]<a[j1-1]){
i++;
break;
}
if(a[i1+1]>a[j1-1]){
j--;
break;
}
i1++,j1--;
}
}
}
}
void output(){
if(flag){
for(int i=1;i<=n;i++){
printf("%c",a[i]);
if(i%80==0) printf("\n");
}
return;
}
for(int i=1;i<=n;i++){
printf("%c",ans[i]);
if(i%80==0) printf("\n");
}
}
int main(){
input();
if(flag==false)
run();
output();
}
这样可以提高代码的执行效率
原文地址: https://www.cveoy.top/t/topic/izAb 著作权归作者所有。请勿转载和采集!