为了优化时间,可以使用双指针的方法来遍历字符串。定义两个指针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();
}

这样可以提高代码的执行效率

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

原文地址: https://www.cveoy.top/t/topic/izAb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录