質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

2回答

448閲覧

atcoder 158 D問題が解けません。

goro_gnm

総合スコア42

C++

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

1グッド

0クリップ

投稿2020/03/13 10:37

atcoder の問題を解いているのですが、実行時エラーとなってしまいます。
なぜエラーになるかわからないので教えてくれるとうれしいです。

問題

atcoder のABC158 D問題
https://atcoder.jp/contests/abc158/tasks/abc158_d

コード

c++

1#include<iostream> 2#include<algorithm> 3using namespace std; 4#include<string> 5 6int main(){ 7 string s; cin >> s; 8 int q; cin >> q; 9 int t[s.length()], f[s.length()], flag = 1; 10 string c[s.length()], top=""; 11 for(int i=0; i<q; i++){ 12 cin >> t[i]; 13 if(t[i] == 1) continue; 14 cin >> f[i] >> c[i]; 15 if(f[i] == 2) f[i] = -1; 16 } 17 for(int i=0; i<q; i++){ 18 if(t[i] == 1){ 19 flag *= -1; 20 }else{ 21 if(flag * f[i] == 1) top.append(c[i]); 22 else s.append(c[i]); 23 } 24 } 25 reverse(top.begin(), top.end()); 26 top.append(s); 27 if(flag == -1) reverse(top.begin(), top.end()); 28 cout << top << endl; 29 return 0; 30} 31
s.k👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

C++

1 int t[s.length()], f[s.length()], flag = 1; 2 string c[s.length()], top="";

この配列の長さはq必要ではないですか?

投稿2020/03/13 18:24

yudedako67

総合スコア2047

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

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

goro_gnm

2020/03/14 02:26

あ、そうですね!ありがとうございます!
guest

0

普通に考えるとこんな感じになると思うんですけど、なんか変なソースになってませんか?

#コンパイル通るコードだと怒られそうなので、ニュアンスだけ

if (t == 1) reverse; if (t == 2 && f == 1) insert(0, x); if (t == 2 && f == 2) insert(length, x);

投稿2020/03/13 11:36

izmktr

総合スコア2856

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

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

goro_gnm

2020/03/14 02:34 編集

string に対して、先頭にinsertするのと前後を反転させるのを毎回実行するのは計算量が多すぎて時間超過になってしまうのではと思います。 なので各クエリに対してstringの末尾に文字列を挿入する(またはしない)だけでこと足りるように書きました。
izmktr

2020/03/14 07:23

もしかして、先頭挿入は時間がかかるけど、反転は時間がかからないと思ってます? 代入の数でいうと、先頭挿入はn+2、反転はn*1.5かかりますよ? 文字列長が1MBレベルなら差として出てきますが、通常だとほぼ0コストです どうしてもそこに時間がかかって時間超過するのなら、dequeを使えばいいです
goro_gnm

2020/03/15 13:44 編集

いや、先頭挿入も反転も時間がかかると思っています。 それらに対し末尾挿入はo(1)であるので、末尾挿入を使ったという趣旨でした。 問題文には 1 < |S| < 10^5 1 < Q < 2 * 10^5 とあり、各クエリで反転させることをすると最大o((S+Q)*Q)であるため、今回に関しては0コストとは言えない状況になると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問