🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2439閲覧

AtcoderでTLEを吐かれたが模範解答より劣っている点がわからないです

renge

総合スコア18

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/04 09:34

#実際の問題と現状
実際の問題
こちらのつい先日行われたABCのC問題なのですが、TLEが出てしまい、それが今でもなぜかがわからないです。C++で書かれた模範解答は自分の力不足で読めなかったのですが、Pythonのほうは特に知らないライブラリが使われているわけではなかったので読むことができたのですが、自分の書いたC++のコードとそれほどアルゴリズムに違いはないように感じられ(むしろ現時点では自分は早いとすら思っています)どこがボトルネックになっているのかが自分の知識ではわからないです。それを教えていただけると非常にありがたいです

実際の問題文(詳細は上のリンクからお願いします)
「N個の文字列 S1,S2,…,SNが与えられます。 各文字列は、英小文字からなる空でない文字列の先頭に ! を 0文字か 1文字付加したものです。文字列 Tは、Tの先頭に!を0文字付加しても1文字付加しても S1,S2,…,SNのいずれかに一致するとき、不満な文字列であるといいます。不満な文字列があるかどうか判定し、あれば 1つ示してください。」(なお、なければ"satisfiable"と出力します)
#模範解答と自分のコード
模範解答

C++

1#include <iostream> 2#include <vector> 3#include <string> 4#include <unordered_set> 5using namespace std; 6int main(){ 7 int N; 8 cin >> N; 9 vector<string> S(N); 10 for(string& s : S) cin >> s; 11 unordered_set<string> h(S.begin(), S.end()); 12 for(string& s : S) if(h.count('!' + s)){ 13 cout << s << endl; 14 return 0; 15 } 16 cout << "satisfiable" << endl; 17}

Python

1N = int(input()) 2S = set(input() for i in range(N)) 3for s in S: 4 if "!" + s in S: 5 print(s) 6 exit() 7print("satisfiable")

自分の回答

C++

1#include <bits/stdc++.h> 2 3#define _GLIBCXX_DEBUG 4 5using namespace std; 6 7/* const int INF = 1000000000; */ 8 9int main(){ 10 int N; 11 cin >> N; 12 13 vector<string> S(N); 14 15 for (int i=0; i<N; i++) 16 cin >> S[i]; 17 18 /* sort(S.begin(), S.end()); */ 19 /* reverse(S.begin(), S.end()); */ 20 21 string T; 22 string output = "satisfiable"; 23 int flag = 0; 24 25 for (int i=0; i<N; i++){ 26 if (S[i][0] == '!') 27 continue; 28 T = "!" + S[i]; 29 for (int j=0; j<N; j++){ 30 if (T == S[j]){ 31 output = S[i]; 32 flag ++; 33 break; 34 } 35 } 36 if (flag == 1) 37 break; 38 } 39 cout << output; 40}

※補足
問題文から、!!hogehogeのような文章は生成されないため、!始まりのものを抜くことで高速化を図りました。vectorのアクセスの計算量はO(1)と見かけたのでそれほど影響はないと思ってます。
逆順にソートすることで!から始まるかどうかを判別せずに済むと思ったので念の為に追加してみましたがソートのほうが時間かかってるようだったので外しました。
INFはDP使うとき用に残しているだけで特に使用していないので誤解を招かないようにコメントアウトしておきました。本番はコメントアウトは特にしなかったです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/01/04 09:40

読んでいませんが、TLE なら無限ループかオーバーフローを疑ってください。たとえば long long が必要な時に int を使っていると TLE になりがちです。
renge

2021/01/04 09:49

テストケースが32件あり、ソートを導入したりアルゴリズムを変更したりしてACが15-20の範囲で変動したのですが、無限ループは考えられますかね?また、forループしか使用していないので無限ループの可能性は低い気がします。(自分の知識不足でしたら申し訳ないです) また、オーバーフローでTLEになるのは盲点でしたのでNと念の為にflagもlong longにしてみましたが結果は同様にTLEとなってしまいました。(念の為にflag++をflag=1にしたりもしましたが同じ結果でした)
Zuishin

2021/01/04 12:11 編集

無限ループではないようですね。O(N^2) なので、模範解答よりかなり効率が悪いコードです。N は最大 2 × 10^5 なので、大きな N が与えられれば時間オーバーする可能性はありますね。
renge

2021/01/04 10:01 編集

あ、PythonでもO(N^2)だと思っていましたが、集合をつかうと検索がO(N)ではなくO(1)で行えるのですね。理解しました。ありがとうございました。回答欄に来ていただいてBAをつけさせていただいてもよろしいでしょうか?
guest

回答1

0

ベストアンサー

最大 2 × 10^5 の二重ループを行っているためと思われます。
模範解答は一重なので、実行時間に差が出るでしょう。

投稿2021/01/04 10:05

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

renge

2021/01/04 10:07

改めてありがとうございました!一ヶ月ほど前に、オブジェクト指向を使うことについての質問の際にもお世話になりました。また機会がありましたらよろしくおねがいします
Zuishin

2021/01/04 10:09

なお、次のサイトを参考にすると、蟻本では次のような目安が書かれているそうです。 https://cppx.hatenablog.com/entry/2017/08/06/104144 > 制限時間が1秒の場合、 > 10の6乗 余裕を持って間に合う > 10の7乗 おそらく間に合う > 10の8乗 非常にシンプルな処理でない限り厳しい
renge

2021/01/05 21:31

なるほどです。わざわざありがとうございます。参考になります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問