1d86ed7fbStbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2005-2021 Intel Corporation
3d86ed7fbStbbdev 
4d86ed7fbStbbdev     Licensed under the Apache License, Version 2.0 (the "License");
5d86ed7fbStbbdev     you may not use this file except in compliance with the License.
6d86ed7fbStbbdev     You may obtain a copy of the License at
7d86ed7fbStbbdev 
8d86ed7fbStbbdev         http://www.apache.org/licenses/LICENSE-2.0
9d86ed7fbStbbdev 
10d86ed7fbStbbdev     Unless required by applicable law or agreed to in writing, software
11d86ed7fbStbbdev     distributed under the License is distributed on an "AS IS" BASIS,
12d86ed7fbStbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d86ed7fbStbbdev     See the License for the specific language governing permissions and
14d86ed7fbStbbdev     limitations under the License.
15d86ed7fbStbbdev */
16d86ed7fbStbbdev 
17d86ed7fbStbbdev #include <iostream>
18d86ed7fbStbbdev #include <string>
19d86ed7fbStbbdev #include <vector>
20d86ed7fbStbbdev #include <algorithm> // std::max
21d86ed7fbStbbdev 
22d86ed7fbStbbdev #include "oneapi/tbb/parallel_for.h"
23d86ed7fbStbbdev #include "oneapi/tbb/blocked_range.h"
24d86ed7fbStbbdev 
25d86ed7fbStbbdev #include "common/utility/utility.hpp"
26d86ed7fbStbbdev 
27d86ed7fbStbbdev bool silent = false;
28d86ed7fbStbbdev 
29d86ed7fbStbbdev static const std::size_t N = 23;
30d86ed7fbStbbdev 
31d86ed7fbStbbdev class SubStringFinder {
32d86ed7fbStbbdev     const std::string &str;
33d86ed7fbStbbdev     std::vector<std::size_t> &max_array;
34d86ed7fbStbbdev     std::vector<std::size_t> &pos_array;
35d86ed7fbStbbdev 
36d86ed7fbStbbdev public:
operator ()(const oneapi::tbb::blocked_range<std::size_t> & r) const37d86ed7fbStbbdev     void operator()(const oneapi::tbb::blocked_range<std::size_t> &r) const {
38d86ed7fbStbbdev         for (std::size_t i = r.begin(); i != r.end(); ++i) {
39d86ed7fbStbbdev             std::size_t max_size = 0, max_pos = 0;
40d86ed7fbStbbdev             for (std::size_t j = 0; j < str.size(); ++j) {
41d86ed7fbStbbdev                 if (j != i) {
42d86ed7fbStbbdev                     std::size_t limit = str.size() - (std::max)(i, j);
43d86ed7fbStbbdev                     for (std::size_t k = 0; k < limit; ++k) {
44d86ed7fbStbbdev                         if (str[i + k] != str[j + k])
45d86ed7fbStbbdev                             break;
46d86ed7fbStbbdev                         if (k > max_size) {
47d86ed7fbStbbdev                             max_size = k;
48d86ed7fbStbbdev                             max_pos = j;
49d86ed7fbStbbdev                         }
50d86ed7fbStbbdev                     }
51d86ed7fbStbbdev                 }
52d86ed7fbStbbdev             }
53d86ed7fbStbbdev             max_array[i] = max_size;
54d86ed7fbStbbdev             pos_array[i] = max_pos;
55d86ed7fbStbbdev         }
56d86ed7fbStbbdev     }
57d86ed7fbStbbdev 
SubStringFinder(const std::string & s,std::vector<std::size_t> & m,std::vector<std::size_t> & p)58d86ed7fbStbbdev     SubStringFinder(const std::string &s, std::vector<std::size_t> &m, std::vector<std::size_t> &p)
59d86ed7fbStbbdev             : str(s),
60d86ed7fbStbbdev               max_array(m),
61d86ed7fbStbbdev               pos_array(p) {}
62d86ed7fbStbbdev };
63d86ed7fbStbbdev 
main(int argc,char * argv[])64d86ed7fbStbbdev int main(int argc, char *argv[]) {
65d86ed7fbStbbdev     // command line parsing
66d86ed7fbStbbdev     utility::parse_cli_arguments(argc,
67d86ed7fbStbbdev                                  argv,
68d86ed7fbStbbdev                                  utility::cli_argument_pack()
69d86ed7fbStbbdev                                      //"-h" option for displaying help is present implicitly
70d86ed7fbStbbdev                                      .arg(silent, "silent", "no output"));
71d86ed7fbStbbdev 
72d86ed7fbStbbdev     std::string str[N] = { std::string("a"), std::string("b") };
73d86ed7fbStbbdev     for (std::size_t i = 2; i < N; ++i)
74d86ed7fbStbbdev         str[i] = str[i - 1] + str[i - 2];
75d86ed7fbStbbdev     std::string &to_scan = str[N - 1];
76d86ed7fbStbbdev     const std::size_t num_elem = to_scan.size();
77d86ed7fbStbbdev 
78d86ed7fbStbbdev     std::vector<std::size_t> max(num_elem);
79d86ed7fbStbbdev     std::vector<std::size_t> pos(num_elem);
80d86ed7fbStbbdev 
81d86ed7fbStbbdev     oneapi::tbb::parallel_for(oneapi::tbb::blocked_range<std::size_t>(0, num_elem),
82d86ed7fbStbbdev                               SubStringFinder(to_scan, max, pos));
83d86ed7fbStbbdev 
84d86ed7fbStbbdev     for (std::size_t i = 0; i < num_elem; ++i)
85d86ed7fbStbbdev         if (!silent)
86d86ed7fbStbbdev             std::cout << " " << max[i] << "(" << pos[i] << ")"
87d86ed7fbStbbdev                       << "\n";
88d86ed7fbStbbdev 
89d86ed7fbStbbdev     return 0;
90d86ed7fbStbbdev }
91