超时,求优化

B4039 [GESP202409 三级] 回文拼接

_safdsfdeaf_ @ 2024-11-30 19:07:31

#include<bits/stdc++.h>
#include<stack>
using namespace std;
int n;
string s,s1,s2="";
stack<char>a;
int i,k,l; 
bool flag1,flag2;
bool p(string s){
    for(i=0;i<s.size();i++)
        a.push(s[i]);
    for(i=0;i<(a.size()/2);i++){
        if(a.top()==s[i]) a.pop();
        else return false;
    }
    return true;
}
int main(){
    cin>>n;
    for(i=0;i<n;i++){
        s1=s2="";
        flag1=false;
        flag2=false;
        cin>>s;
        s1+=s[0];
        for(k=1;k<s.length()-2;k++){
            s1+=s[k];
            flag1=p(s1);
            for(l=k+1;l<s.length();l++)
                s2+=s[l];
            flag2=p(s2);
            if(p(s1)&&p(s2)){
                cout<<"Yes"<<endl;
                break;
            }
        }
        if(!(p(s1)&&p(s2))) cout<<"No"<<endl;
    }
    return 0;
}

by sinfg @ 2024-11-30 19:20:04

你这个cout可以优化一下,加一个 ios::snyc_with_stdio(false); 关一下同步流 我还给你改了些东西 完整代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

// 检查字符串是否为回文
bool isPalindrome(const string& str) {
    int left = 0;
    int right = str.size() - 1;
    while (left < right) {
        if (str[left] != str[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        bool found = false;

        // 尝试分割字符串并检查两部分是否都是回文
        for (int j = 1; j < s.size(); j++) {
            string s1 = s.substr(0, j);
            string s2 = s.substr(j);
            if (isPalindrome(s1) && isPalindrome(s2)) {
                cout << "Yes" << endl;
                found = true;
                break;
            }
        }

        // 如果没有找到任何分割方式使得两部分都是回文
        if (!found) {
            cout << "No" << endl;
        }
    }
    return 0;
}

by kapibala__ @ 2024-12-06 21:23:30

@sinfg 你没有判断长度哦 样例第三个过不了


|