質問編集履歴

2

補足

2017/07/08 08:22

投稿

gyro16
gyro16

スコア89

test CHANGED
File without changes
test CHANGED
@@ -20,6 +20,12 @@
20
20
 
21
21
 
22
22
 
23
+ このプログラムは文字列t に、q個の与えられる文字列が含まれているかを判定するもので、
24
+
25
+ 含まれていれば 1、含まれていなければ 0を表示するものです。
26
+
27
+
28
+
23
29
  ###発生している問題・エラーメッセージ
24
30
 
25
31
 

1

訂正

2017/07/08 08:22

投稿

gyro16
gyro16

スコア89

test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,170 @@
14
14
 
15
15
 
16
16
 
17
+ compare()が使われている様子が分かりません。
18
+
19
+ compareが明示的に使われていないので、なおさら分かりにくいです。
20
+
21
+
22
+
23
+ ###発生している問題・エラーメッセージ
24
+
25
+
26
+
27
+ ```
28
+
29
+ エラーメッセージ
30
+
31
+ ```
32
+
33
+
34
+
35
+ ###該当のソースコード
36
+
37
+ ```java
38
+
39
+
40
+
41
+ import java.util.*;
42
+
43
+
44
+
45
+ public class Algo51{
46
+
47
+ public static void main(String[] args){
48
+
49
+
50
+
51
+ Scanner scan = new Scanner(System.in);
52
+
53
+ String t = scan.next();
54
+
55
+ StringIndex si = new StringIndex(t, false);
56
+
57
+
58
+
59
+ int q = scan.nextInt();
60
+
61
+ for(int i = 0; i < q; i++)
62
+
63
+ if(si.isExist(scan.next(), t))
64
+
65
+ System.out.println("1");
66
+
67
+ else
68
+
69
+ System.out.println("0");
70
+
71
+
72
+
73
+ scan.close();
74
+
75
+ System.exit(0);
76
+
77
+ }
78
+
79
+ }
80
+
81
+
82
+
83
+ class StringIndex{
84
+
85
+ class StIdx{
86
+
87
+ int pos;
88
+
89
+ char ch;
90
+
91
+
92
+
93
+ public StIdx(int i, char c){
94
+
95
+ pos = i;
96
+
97
+ ch = c;
98
+
99
+ }
100
+
101
+ }
102
+
103
+
104
+
105
+ List<StIdx> idx = new ArrayList<StIdx>();
106
+
107
+ int[] seq;
108
+
109
+ int compLen = 1;
110
+
111
+ boolean debug;
112
+
113
+
114
+
115
+ public StringIndex(String t, boolean d){
116
+
117
+ debug = d;
118
+
119
+
120
+
121
+ seq = new int[t.length()];
122
+
123
+ for(int i = 0; i < t.length(); i++)
124
+
125
+ idx.add(new StIdx(i, t.charAt(i)));
126
+
127
+
128
+
129
+ for(compLen =1; compLen < idx.size() * 2; compLen *= 2){
130
+
131
+ Collections.sort(idx, new strIndexComp());
132
+
133
+
134
+
135
+ int[] tmp = new int[seq.length];
136
+
137
+
138
+
139
+ tmp[idx.get(0).pos] = 1;
140
+
141
+ for(int i = 1; i < tmp.length; i++)
142
+
143
+ if(idxComp(idx.get(i-1), idx.get(i)) == 0)
144
+
145
+ tmp[idx.get(i).pos] = tmp[idx.get(i-1).pos];
146
+
147
+ else
148
+
149
+ tmp[idx.get(i).pos] = tmp[idx.get(i-1).pos] + 1;
150
+
151
+
152
+
153
+ for(int i = 0; i < seq.length; i++)
154
+
155
+ seq[i] = tmp[i];
156
+
157
+
158
+
159
+ if(debug){
160
+
161
+ System.out.println("------------");
162
+
163
+ for(int i = 0; i < idx.size(); i++)
164
+
165
+ System.out.println(i + "\t" + seq[idx.get(i).pos] + "\t" + idx.get(i).pos + "\t"
166
+
167
+ + t.substring(idx.get(i).pos));
168
+
169
+ }
170
+
171
+ }
172
+
173
+ }
174
+
175
+
176
+
177
+ class strIndexComp implements Comparator<StIdx>{
178
+
179
+
180
+
17
181
  @Override
18
182
 
19
183
  public int compare(StIdx o1, StIdx o2){
@@ -84,292 +248,58 @@
84
248
 
85
249
 
86
250
 
251
+ public boolean isExist(String p, String t){
252
+
253
+ int low = 0, hi = idx.size() - 1;
254
+
87
- compare()が使われている様子が分かりません。
255
+ return (findBin(p, t, low, hi));
256
+
88
-
257
+ }
258
+
259
+
260
+
261
+ private boolean findBin(String p, String t, int low, int hi){
262
+
263
+ if(low > hi)
264
+
265
+ return false;
266
+
89
- compareが明示的に使われていないので、なおさら分かりにくいです。
267
+ int i = low + (hi - low) / 2;
90
-
91
-
92
-
268
+
93
- ###発生している問題・エラーメッセージ
269
+ int len = p.length();
270
+
94
-
271
+ if(len > t.length() - idx.get(i).pos)
272
+
95
-
273
+ len = t.length() - idx.get(i).pos;
274
+
275
+
276
+
277
+ int r = p.substring(0, len).compareTo(t.substring(idx.get(i).pos, idx.get(i).pos + len));
278
+
279
+ if(r == 0)
280
+
281
+ if(len == p.length())
282
+
283
+ return true;
284
+
285
+ else
286
+
287
+ return findBin(p, t, i+1, hi);
288
+
289
+ else if(r < 0)
290
+
291
+ return findBin(p, t, low, i-1);
292
+
293
+ else
294
+
295
+ return findBin(p, t, i+1, hi);
296
+
297
+ }
298
+
299
+ }
96
300
 
97
301
  ```
98
302
 
99
- エラーメッセージ
100
-
101
- ```
102
-
103
-
104
-
105
- ###該当のソースコード
106
-
107
- ```java
108
-
109
-
110
-
111
- import java.util.*;
112
-
113
-
114
-
115
- public class Algo51{
116
-
117
- public static void main(String[] args){
118
-
119
-
120
-
121
- Scanner scan = new Scanner(System.in);
122
-
123
- String t = scan.next();
124
-
125
- StringIndex si = new StringIndex(t, false);
126
-
127
-
128
-
129
- int q = scan.nextInt();
130
-
131
- for(int i = 0; i < q; i++)
132
-
133
- if(si.isExist(scan.next(), t))
134
-
135
- System.out.println("1");
136
-
137
- else
138
-
139
- System.out.println("0");
140
-
141
-
142
-
143
- scan.close();
144
-
145
- System.exit(0);
146
-
147
- }
148
-
149
- }
150
-
151
-
152
-
153
- class StringIndex{
154
-
155
- class StIdx{
156
-
157
- int pos;
158
-
159
- char ch;
160
-
161
-
162
-
163
- public StIdx(int i, char c){
164
-
165
- pos = i;
166
-
167
- ch = c;
168
-
169
- }
170
-
171
- }
172
-
173
-
174
-
175
- List<StIdx> idx = new ArrayList<StIdx>();
176
-
177
- int[] seq;
178
-
179
- int compLen = 1;
180
-
181
- boolean debug;
182
-
183
-
184
-
185
- public StringIndex(String t, boolean d){
186
-
187
- debug = d;
188
-
189
-
190
-
191
- seq = new int[t.length()];
192
-
193
- for(int i = 0; i < t.length(); i++)
194
-
195
- idx.add(new StIdx(i, t.charAt(i)));
196
-
197
-
198
-
199
- for(compLen =1; compLen < idx.size() * 2; compLen *= 2){
200
-
201
- Collections.sort(idx, new strIndexComp());
202
-
203
-
204
-
205
- int[] tmp = new int[seq.length];
206
-
207
-
208
-
209
- tmp[idx.get(0).pos] = 1;
210
-
211
- for(int i = 1; i < tmp.length; i++)
212
-
213
- if(idxComp(idx.get(i-1), idx.get(i)) == 0)
214
-
215
- tmp[idx.get(i).pos] = tmp[idx.get(i-1).pos];
216
-
217
- else
218
-
219
- tmp[idx.get(i).pos] = tmp[idx.get(i-1).pos] + 1;
220
-
221
-
222
-
223
- for(int i = 0; i < seq.length; i++)
224
-
225
- seq[i] = tmp[i];
226
-
227
-
228
-
229
- if(debug){
230
-
231
- System.out.println("------------");
232
-
233
- for(int i = 0; i < idx.size(); i++)
234
-
235
- System.out.println(i + "\t" + seq[idx.get(i).pos] + "\t" + idx.get(i).pos + "\t"
236
-
237
- + t.substring(idx.get(i).pos));
238
-
239
- }
240
-
241
- }
242
-
243
- }
244
-
245
-
246
-
247
- class strIndexComp implements Comparator<StIdx>{
248
-
249
-
250
-
251
- @Override
252
-
253
- public int compare(StIdx o1, StIdx o2){
254
-
255
- return idxComp(o1, o2);
256
-
257
- }
258
-
259
- }
260
-
261
-
262
-
263
- private int idxComp(StIdx o1, StIdx o2){
264
-
265
- if(compLen == 1)
266
-
267
- if(o1.ch > o2.ch)
268
-
269
- return 1;
270
-
271
- else if(o1.ch == o2.ch)
272
-
273
- return 0;
274
-
275
- else
276
-
277
- return -1;
278
-
279
-
280
-
281
- if(seq[o1.pos] > seq[o2.pos])
282
-
283
- return 1;
284
-
285
- if(seq[o1.pos] == seq[o2.pos]){
286
-
287
- int npos1 = o1.pos + compLen / 2;
288
-
289
- int npos2 = o2.pos + compLen / 2;
290
-
291
- int nseq1 = 0, nseq2 = 0;
292
-
293
- if(npos1 < seq.length)
294
-
295
- nseq1 = seq[npos1];
296
-
297
- if(npos2 < seq.length)
298
-
299
- nseq2 = seq[npos2];
300
-
301
- if(nseq1 > nseq2)
302
-
303
- return 1;
304
-
305
- else if(nseq1 == nseq2)
306
-
307
- return 0;
308
-
309
- else
310
-
311
- return -1;
312
-
313
- }
314
-
315
- return -1;
316
-
317
- }
318
-
319
-
320
-
321
- public boolean isExist(String p, String t){
322
-
323
- int low = 0, hi = idx.size() - 1;
324
-
325
- return (findBin(p, t, low, hi));
326
-
327
- }
328
-
329
-
330
-
331
- private boolean findBin(String p, String t, int low, int hi){
332
-
333
- if(low > hi)
334
-
335
- return false;
336
-
337
- int i = low + (hi - low) / 2;
338
-
339
- int len = p.length();
340
-
341
- if(len > t.length() - idx.get(i).pos)
342
-
343
- len = t.length() - idx.get(i).pos;
344
-
345
-
346
-
347
- int r = p.substring(0, len).compareTo(t.substring(idx.get(i).pos, idx.get(i).pos + len));
348
-
349
- if(r == 0)
350
-
351
- if(len == p.length())
352
-
353
- return true;
354
-
355
- else
356
-
357
- return findBin(p, t, i+1, hi);
358
-
359
- else if(r < 0)
360
-
361
- return findBin(p, t, low, i-1);
362
-
363
- else
364
-
365
- return findBin(p, t, i+1, hi);
366
-
367
- }
368
-
369
- }
370
-
371
- ```
372
-
373
303
 
374
304
 
375
305
  ###試したこと