#15558: TLE? 有可以加速的空間嗎? 請高手指點


hshua (hshua)

學校 : 新北市立林口高級中學
編號 : 52506
來源 : [125.228.147.181]
最後登入時間 :
2024-11-10 13:26:19
d781. 00195 - Anagram -- UVa195 | From: [220.133.124.237] | 發表日期 : 2018-10-13 21:48

TLE? 有可以加速的空間嗎? 請高手指點

#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
vector<string> V;
char A[50];
char T[50];
bool v[50];
int len;
//----------------------------------------------
bool compare(string a, string b){
    int k=a.length();
    for(int i=0; i<k; i++){
        char aa=tolower(a[i]);
        char bb=tolower(b[i]);
        if(aa<bb) return true;
        else if(aa>bb) return false;
        else if(aa==bb && a[i]>b[i]) return false;
        else if(aa==bb && a[i]<b[i]) return true;
    }
    return true;
}
//----------------------------------------------
void DFS(int k){
    if(k>=len){
        V.push_back(T);
        return;
    }

    for(int i=0; i<len; i++){ //遞迴
        if(v[i]==0){
            v[i]=1;
            T[k]=A[i];
            DFS(k+1);
            T[k]=' ';
            v[i]=0;
        } 
    }
}
//==============================================
int main(){
int u;
    cin>>u;
    while(u--){
        while(scanf("%s",A)!=-1){
            len=strlen(A);
            memset(v,0,sizeof(v));
            V.clear();
            int k=0;
            DFS(k);

            sort(V.begin(), V.end(), compare);

            for(int i=0; i<V.size(); i++){
                if(V[i] != V[i+1]) cout<<V[i]<<endl;
            }
        }
    }
    return 0;
}

 
#15562: Re:TLE? 有可以加速的空間嗎? 請高手指點


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [49.216.18.187]
最後登入時間 :
2024-11-10 10:25:04
d781. 00195 - Anagram -- UVa195 | From: [140.113.208.181] | 發表日期 : 2018-10-14 02:11

原文全部吃掉

這一題不需要把DFS產生全部的結果存起來做排序檢查有沒有和前一個一樣

題目希望你的作法應該是一邊展開DFS時,

除了比對這個字元有沒有用過之外, 你需要存上一次迴圈時使用的字元拿來跟這一輪字元比對, 需要不一樣才能進到下一次遞迴

題目和這一題做法雷同:d436: 10098 - Generating Fast, Sorted Permutation

讓你多一個練習的機會

 

 
 
ZeroJudge Forum