#28913: 請問,避免tle的方法


soyana66687@gmail.com (Dino\n)

學校 : 國立臺中科技大學
編號 : 97371
來源 : [60.250.9.66]
最後登入時間 :
2022-07-02 20:52:24
h083. 3. 數位占卜 -- 2022年1月APCS | From: [36.234.142.203] | 發表日期 : 2022-01-12 12:39

自己已經使用 判斷字串奇數 和 一比對到不符合的字直接跳出迴圈 這兩個方法使自己的程式能快一點

但是仍然TLE......

請問各位大神有甚麼辦法能夠解決?

#include <iostream>

#include <vector>

using namespace std;

int main(){

    int m;

    while(cin>>m){//處理輸入

        vector<string>v;

        int total=0;

        for(int i=0;i<m;i++){

            string s;

            cin>>s;

            v.push_back(s);

        }

        //處理輸出

        for(int i=0;i<m;i++){

            for(int j=(i+1);j<m;j++){

                string comp=v[i]+v[j]//將字串結合在一起

                int comp_length=comp.length();//如果字串長度是奇數,絕對不符合

                if(comp_length%2!=0)continue;

                int mid=(comp_length)/2;

                bool compare=true;//判斷是否符合

                for(int k=0;k<mid;k++){//將字串用mid分成前半後半

                    if(comp[k]!=comp[mid+k]){

                        compare=false;

                        break;

                    }

                }

                if(compare)total++;

            }

        }

        cout<<total<<endl;

    }

    return 0;

}

 

 

 
#28915: Re:請問,避免tle的方法


r1cky (hehe)

學校 : 國立臺灣師範大學
編號 : 158637
來源 : [118.166.194.111]
最後登入時間 :
2024-04-13 22:10:59
h083. 3. 數位占卜 -- 2022年1月APCS | From: [210.71.78.245] | 發表日期 : 2022-01-12 13:34

自己已經使用 判斷字串奇數 和 一比對到不符合的字直接跳出迴圈 這兩個方法使自己的程式能快一點

但是仍然TLE......

請問各位大神有甚麼辦法能夠解決?

#include

#include

using namespace std;

int main(){

    int m;

    while(cin>>m){//處理輸入

        vectorv;

        int total=0;

        for(int i=0;i<m;i++){

            string s;

            cin>>s;

            v.push_back(s);

        }

        //處理輸出

        for(int i=0;i<m;i++){

            for(int j=(i+1);j<m;j++){

                string comp=v[i]+v[j]//將字串結合在一起

                int comp_length=comp.length();//如果字串長度是奇數,絕對不符合

                if(comp_length%2!=0)continue;

                int mid=(comp_length)/2;

                bool compare=true;//判斷是否符合

                for(int k=0;k<mid;k++){//將字串用mid分成前半後半

                    if(comp[k]!=comp[mid+k]){

                        compare=false;

                        break;

                    }

                }

                if(compare)total++;

            }

        }

        cout<<total<<endl;

    }

    return 0;

}

 

 

這方法太慢了,先以複雜度的觀點這樣完全行不通,畢竟你不能窮舉每個字串的組合,這樣光枚舉就已經O(m^2),就已經超過10^9,而且這還不包括判斷(複雜度可能再乘個L),就算你加速這個方法也不行吧!

 
#30592: Re: 請問,避免tle的方法


fire5386 (becaidorz)

學校 : 國立清華大學
編號 : 115822
來源 : [140.114.217.8]
最後登入時間 :
2024-04-13 22:06:23
h083. 3. 數位占卜 -- 2022年1月APCS | From: [114.25.48.5] | 發表日期 : 2022-05-30 18:26

 

這方法太慢了,先以複雜度的觀點這樣完全行不通,畢竟你不能窮舉每個字串的組合,這樣光枚舉就已經O(m^2),就已經超過10^9,而且這還不包括判斷(複雜度可能再乘個L),就算你加速這個方法也不行吧!


瑞1奇教複雜度嗎窩弱窩不會

 
#30593: Re: 請問,避免tle的方法


linlincaleb@gmail.com (臨末之頌)

學校 : 新北市立板橋高級中學
編號 : 132772
來源 : [111.248.111.135]
最後登入時間 :
2023-04-01 22:41:13
h083. 3. 數位占卜 -- 2022年1月APCS | From: [111.248.114.127] | 發表日期 : 2022-05-30 19:26

 

這方法太慢了,先以複雜度的觀點這樣完全行不通,畢竟你不能窮舉每個字串的組合,這樣光枚舉就已經O(m^2),就已經超過10^9,而且這還不包括判斷(複雜度可能再乘個L),就算你加速這個方法也不行吧!


瑞1奇教複雜度嗎窩弱窩不會

你很會裝弱喔

 
ZeroJudge Forum