回答編集履歴

4

a

2020/04/19 04:35

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -65,3 +65,7 @@
65
65
 
66
66
 
67
67
  [https://atcoder.jp/contests/abc063/submissions/12063799](https://atcoder.jp/contests/abc063/submissions/12063799)
68
+
69
+
70
+
71
+ ちなみに上記コードでは入力される文字エンコードがASCII互換のようなa~zまで連続していると仮定しています。C++規格書では、0~9の文字エンコードの連続は保証されていますが、それ以外については保証がありません。競技プログラミングの文脈ではこの仮定はできるでしょうが、現実のコードで書いたらぶっ飛ばされるでしょう。つまり公平のために書くと、そういうportableなコードにするためには`std::set`/`std::unorded_set`を使うのは一つの選択肢です(殆どの文脈で`std::unorded_set`は`std::set`より優れています、今回の例では差がつかないかbucketのメモリ確保分だけ`std::unorded_set`のほうが遅いでしょうが)。

3

setなんぞいらん

2020/04/19 04:35

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -13,3 +13,55 @@
13
13
 
14
14
 
15
15
  まあしかし、それをして正しい答えは出るでしょうが、依然として問題が残ります。つまり、計算数が多すぎるということです。そこで活躍するのは投票(ヒストリグラム)という考え方です。一般には`std::unorded_set`を使う案件ですが、今回「Sは英小文字のみからなる」という制約がありますから、高々26種類しかないわけです。すると単なる配列を使って投票ができますね。まあ今回は最大でも26^2回の比較が26回に減るだけなのでそこまで実行時間に効いてこないかもしれないですが。
16
+
17
+
18
+
19
+ ---
20
+
21
+
22
+
23
+ なんか`std::set`を使っている回答を見たが、そんなものを使う必要はないと言ったはずである。
24
+
25
+
26
+
27
+ ```cpp
28
+
29
+ #include <string>
30
+
31
+ #include <iostream>
32
+
33
+ int main()
34
+
35
+ {
36
+
37
+ std::string input;
38
+
39
+ std::cin >> input;
40
+
41
+ bool found[26]{};
42
+
43
+ // 入力がASCII互換であると決め打ちする
44
+
45
+ for(auto c : input) {
46
+
47
+ if (found[c - 'a']){
48
+
49
+ std::cout << "no" << std::endl;
50
+
51
+ return 0;
52
+
53
+ }
54
+
55
+ found[c - 'a'] = true;
56
+
57
+ }
58
+
59
+ std::cout << "yes" << std::endl;
60
+
61
+ }
62
+
63
+ ```
64
+
65
+
66
+
67
+ [https://atcoder.jp/contests/abc063/submissions/12063799](https://atcoder.jp/contests/abc063/submissions/12063799)

2

O

2020/04/19 04:25

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -12,4 +12,4 @@
12
12
 
13
13
 
14
14
 
15
- まあしかし、それをして正しい答えは出るでしょうが、依然として問題が残ります。つまり、計算数が多すぎるということです。そこで活躍するのは投票(ヒストリグラム)という考え方です。一般には`std::unorded_set`を使う案件ですが、今回「Sは英小文字のみからなる」という制約がありますから、高々26種類しかないわけです。すると単なる配列を使って投票ができますね。
15
+ まあしかし、それをして正しい答えは出るでしょうが、依然として問題が残ります。つまり、計算数が多すぎるということです。そこで活躍するのは投票(ヒストリグラム)という考え方です。一般には`std::unorded_set`を使う案件ですが、今回「Sは英小文字のみからなる」という制約がありますから、高々26種類しかないわけです。すると単なる配列を使って投票ができますね。まあ今回は最大でも26^2回の比較が26回に減るだけなのでそこまで実行時間に効いてこないかもしれないですが。

1

ヒストリグラム

2020/04/18 04:30

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -9,3 +9,7 @@
9
9
 
10
10
 
11
11
  「Sに含まれる文字がすべて異なる」という命題の逆がなにかを考えてみてください。そうすればループの継続条件がおのずからわかるでしょう。
12
+
13
+
14
+
15
+ まあしかし、それをして正しい答えは出るでしょうが、依然として問題が残ります。つまり、計算数が多すぎるということです。そこで活躍するのは投票(ヒストリグラム)という考え方です。一般には`std::unorded_set`を使う案件ですが、今回「Sは英小文字のみからなる」という制約がありますから、高々26種類しかないわけです。すると単なる配列を使って投票ができますね。