#実際の問題と現状
実際の問題
こちらのつい先日行われた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使うとき用に残しているだけで特に使用していないので誤解を招かないようにコメントアウトしておきました。本番はコメントアウトは特にしなかったです。
回答1件
あなたの回答
tips
プレビュー