@@ -132,7 +132,7 @@ class Random {
132
132
}
133
133
134
134
template <typename T, typename ... Args>
135
- T tnext (Args... args) {
135
+ static T tnext (Args... args) {
136
136
return TypedRandom<T>::next (args...);
137
137
}
138
138
};
@@ -215,124 +215,6 @@ void registerGen(int argc, char *argv[]) {
215
215
216
216
namespace impl {
217
217
218
- namespace pattern {
219
-
220
- /*
221
- Here we go with patterns of kind 'ab{2-10}[c-f][^1-9]{16}'. The grammar is
222
- described further.
223
-
224
- Pattern ::= Block | Block Pattern
225
- Block ::= Set | Set Count
226
- Count ::= {int} | {int-int} // int - regular integer
227
- Set ::= [PosSet] | [NegSet] | Char
228
- NegSet ::= ^ Subset
229
- PosSet ::= x Subset // x -- any char except ^
230
- Subset ::= Range | Range Set
231
- Range ::= Char | Char-Char
232
- Char ::= c | \ Special // c -- any non-special
233
- Special ::= [ ] \ - { }
234
- */
235
-
236
- struct Set {
237
- static const char MIN = 32 ;
238
- static const char MAX = 127 ;
239
-
240
- std::vector<char > allowed; // should be bool but <s>int is faster</s> who cares
241
-
242
- void negate () {
243
- std::vector<char > all (MAX - MIN + 1 );
244
- std::iota (all.begin (), all.end (), MIN);
245
- std::vector<char > result;
246
- set_symmetric_difference (
247
- allowed.begin (), allowed.end (),
248
- all.begin (), all.end (),
249
- std::back_inserter (result));
250
- allowed = result;
251
- }
252
-
253
- Set () {}
254
-
255
- Set (const std::bitset<256 >& bitset) {
256
- for (int i = MIN; i <= MAX; ++i) {
257
- if (bitset[i]) {
258
- allowed.push_back (i);
259
- }
260
- }
261
- }
262
- };
263
-
264
- typedef std:pair<int , int > Range;
265
-
266
- struct Block {
267
- Set set;
268
- Range range;
269
- };
270
-
271
- struct Pattern {
272
- std::vector<Block> blocks;
273
-
274
- std::string generate (std::function<size_t >(size_t )&& randomEngine);
275
- };
276
-
277
- class Parser {
278
- public:
279
- Parser (const std::string& pattern) : pattern_(pattern) {}
280
-
281
- Pattern parse ();
282
-
283
- private:
284
- Block parseBlock ();
285
-
286
- int next () const {
287
- return position_ < pattern_.size () ? pattern_[position_] : -1 ;
288
- }
289
-
290
- std::string pattern_;
291
- size_t position_;
292
- };
293
-
294
- struct ParsingException : public std ::logic_error {};
295
-
296
- Pattern Parser::parse () {
297
- ensure (position_ == 0 , " Cannot parse the same pattern more than once" );
298
-
299
- Pattern result;
300
-
301
- try {
302
- while (position_ != pattern_.size ()) {
303
- result.blocks .push_back (parseBlock ());
304
- }
305
- return resut;
306
- } catch (ParsingException& e) {
307
- std::string msg = " Failed to parse the pattern: '" + pattern_ + " '" ;
308
- ensure (false , msg);
309
- }
310
-
311
- return resut;
312
- }
313
-
314
- Block Parser::parseBlock () {
315
- // 1) parse set
316
-
317
- int first = next ();
318
- if (first == -1 ) {
319
- throw ParsingException ();
320
- }
321
-
322
- std::bitset<256 > allowed;
323
- bool negate = first == ' ^' ;
324
- if (!negate) {
325
- allowed[first] = true ;
326
- }
327
-
328
- } // namespace detail
329
-
330
- } // namespace impl
331
-
332
- #include < bits/stdc++.h>
333
-
334
- namespace impl {
335
-
336
218
class Dsu {
337
219
public:
338
220
int getParent (int x) {
@@ -888,6 +770,11 @@ class GenericArray : public ReprProxy<GenericArray<T>>, public std::vector<T> {
888
770
using Base::insert;
889
771
using Base::clear;
890
772
773
+ template <typename F, typename ...Args>
774
+ static GenericArray<T> randomf (size_t size, F func, const Args& ... args);
775
+ template <typename F, typename ...Args>
776
+ static GenericArray<T> randomfUnique (size_t size, F func, const Args& ... args);
777
+
891
778
template <typename ...Args>
892
779
static GenericArray<T> random (size_t size, const Args& ... args);
893
780
template <typename ...Args>
@@ -934,6 +821,20 @@ GenericArray<T> GenericArray<T>::random(size_t size, const Args& ... args) {
934
821
return result;
935
822
}
936
823
824
+ template <typename T>
825
+ template <typename F, typename ...Args>
826
+ GenericArray<T> GenericArray<T>::randomf(
827
+ size_t size,
828
+ F func,
829
+ const Args& ... args)
830
+ {
831
+ GenericArray<T> result (size);
832
+ for (T& x: result) {
833
+ x = func (args...);
834
+ }
835
+ return result;
836
+ }
837
+
937
838
namespace detail {
938
839
939
840
template <typename T, typename Enable = std::size_t >
@@ -950,9 +851,11 @@ struct DictContainer<T, typename std::hash<T>::result_type>
950
851
} // namespace detail
951
852
952
853
template <typename T>
953
- template <typename ...Args>
954
- GenericArray<T> GenericArray<T>::randomUnique(
955
- size_t size, const Args& ... args)
854
+ template <typename F, typename ...Args>
855
+ GenericArray<T> GenericArray<T>::randomfUnique(
856
+ size_t size,
857
+ F func,
858
+ const Args& ... args)
956
859
{
957
860
typename detail::DictContainer<T>::type set;
958
861
GenericArray<T> result;
@@ -965,7 +868,7 @@ GenericArray<T> GenericArray<T>::randomUnique(
965
868
ensure (false , " There are not enough unique elements" );
966
869
}
967
870
968
- T t = rnd. tnext <T> (args...);
871
+ T t = func (args...);
969
872
if (!set.count (t)) {
970
873
set.insert (t);
971
874
result.push_back (t);
@@ -975,6 +878,17 @@ GenericArray<T> GenericArray<T>::randomUnique(
975
878
return result;
976
879
}
977
880
881
+ template <typename T>
882
+ template <typename ...Args>
883
+ GenericArray<T> GenericArray<T>::randomUnique(
884
+ size_t size, const Args& ... args)
885
+ {
886
+ return GenericArray<T>::randomfUnique (
887
+ size,
888
+ rnd.tnext <T, Args...>,
889
+ args...);
890
+ }
891
+
978
892
template <typename T>
979
893
GenericArray<T> GenericArray<T>::id(size_t size, T start) {
980
894
constexpr bool enable = std::is_integral<T>::value;
@@ -1159,6 +1073,42 @@ impl::GenericArray<T> makeArray(const std::initializer_list<T>& values) {
1159
1073
return impl::GenericArray<T>(values);
1160
1074
}
1161
1075
1076
+
1077
+ namespace impl {
1078
+
1079
+ class ArrayRandom {
1080
+ public:
1081
+ ArrayRandom () {
1082
+ static bool created = false ;
1083
+ ensure (!created, " impl::ArrayRandom should be created only once" );
1084
+ created = true ;
1085
+ }
1086
+
1087
+ template <typename F, typename ...Args>
1088
+ static auto randomf (
1089
+ size_t size,
1090
+ F func,
1091
+ Args... args) -> GenericArray<decltype(func(args...))>
1092
+ {
1093
+ typedef decltype (func (args...)) T;
1094
+ return GenericArray<T>::randomf (size, func, args...);
1095
+ }
1096
+
1097
+ template <typename F, typename ...Args>
1098
+ static auto randomfUnique (
1099
+ size_t size,
1100
+ F func,
1101
+ Args... args) -> GenericArray<decltype(func(args...))>
1102
+ {
1103
+ typedef decltype (func (args...)) T;
1104
+ return GenericArray<T>::randomfUnique (size, func, args...);
1105
+ }
1106
+ } rnda;
1107
+
1108
+ } // namespace impl
1109
+
1110
+ using impl::rnda;
1111
+
1162
1112
#include < bits/stdc++.h>
1163
1113
1164
1114
0 commit comments