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 <algorithm>
20d86ed7fbStbbdev #include <vector>
21d86ed7fbStbbdev #include <algorithm> // std::max
22d86ed7fbStbbdev
23d86ed7fbStbbdev #include "oneapi/tbb/parallel_for.h"
24d86ed7fbStbbdev #include "oneapi/tbb/blocked_range.h"
25d86ed7fbStbbdev
26d86ed7fbStbbdev static const std::size_t N = 9;
27d86ed7fbStbbdev
28d86ed7fbStbbdev class SubStringFinder {
29d86ed7fbStbbdev const std::string &str;
30d86ed7fbStbbdev std::vector<std::size_t> &max_array;
31d86ed7fbStbbdev std::vector<std::size_t> &pos_array;
32d86ed7fbStbbdev
33d86ed7fbStbbdev public:
operator ()(const oneapi::tbb::blocked_range<std::size_t> & r) const34d86ed7fbStbbdev void operator()(const oneapi::tbb::blocked_range<std::size_t> &r) const {
35d86ed7fbStbbdev for (std::size_t i = r.begin(); i != r.end(); ++i) {
36d86ed7fbStbbdev std::size_t max_size = 0, max_pos = 0;
37d86ed7fbStbbdev for (std::size_t j = 0; j < str.size(); ++j) {
38d86ed7fbStbbdev if (j != i) {
39d86ed7fbStbbdev std::size_t limit = str.size() - (std::max)(i, j);
40d86ed7fbStbbdev for (std::size_t k = 0; k < limit; ++k) {
41d86ed7fbStbbdev if (str[i + k] != str[j + k])
42d86ed7fbStbbdev break;
43d86ed7fbStbbdev if (k + 1 > max_size) {
44d86ed7fbStbbdev max_size = k + 1;
45d86ed7fbStbbdev max_pos = j;
46d86ed7fbStbbdev }
47d86ed7fbStbbdev }
48d86ed7fbStbbdev }
49d86ed7fbStbbdev }
50d86ed7fbStbbdev max_array[i] = max_size;
51d86ed7fbStbbdev pos_array[i] = max_pos;
52d86ed7fbStbbdev }
53d86ed7fbStbbdev }
54d86ed7fbStbbdev
SubStringFinder(const std::string & s,std::vector<std::size_t> & m,std::vector<std::size_t> & p)55d86ed7fbStbbdev SubStringFinder(const std::string &s, std::vector<std::size_t> &m, std::vector<std::size_t> &p)
56d86ed7fbStbbdev : str(s),
57d86ed7fbStbbdev max_array(m),
58d86ed7fbStbbdev pos_array(p) {}
59d86ed7fbStbbdev };
60d86ed7fbStbbdev
main()61d86ed7fbStbbdev int main() {
62d86ed7fbStbbdev std::string str[N] = { std::string("a"), std::string("b") };
63d86ed7fbStbbdev for (std::size_t i = 2; i < N; ++i)
64d86ed7fbStbbdev str[i] = str[i - 1] + str[i - 2];
65d86ed7fbStbbdev std::string &to_scan = str[N - 1];
66d86ed7fbStbbdev const std::size_t num_elem = to_scan.size();
67d86ed7fbStbbdev std::cout << "String to scan: " << to_scan << "\n";
68d86ed7fbStbbdev
69d86ed7fbStbbdev std::vector<std::size_t> max(num_elem);
70d86ed7fbStbbdev std::vector<std::size_t> pos(num_elem);
71d86ed7fbStbbdev
72d86ed7fbStbbdev oneapi::tbb::parallel_for(oneapi::tbb::blocked_range<std::size_t>(0, num_elem, 100),
73d86ed7fbStbbdev SubStringFinder(to_scan, max, pos));
74d86ed7fbStbbdev
75d86ed7fbStbbdev for (std::size_t i = 0; i < num_elem; ++i) {
76d86ed7fbStbbdev for (std::size_t j = 0; j < num_elem; ++j) {
77d86ed7fbStbbdev if (j >= i && j < i + max[i])
78d86ed7fbStbbdev std::cout << "_";
79d86ed7fbStbbdev else
80d86ed7fbStbbdev std::cout << " ";
81d86ed7fbStbbdev }
82d86ed7fbStbbdev std::cout << "\n" << to_scan << "\n";
83d86ed7fbStbbdev
84d86ed7fbStbbdev for (std::size_t j = 0; j < num_elem; ++j) {
85d86ed7fbStbbdev if (j >= pos[i] && j < pos[i] + max[i])
86d86ed7fbStbbdev std::cout << "*";
87d86ed7fbStbbdev else
88d86ed7fbStbbdev std::cout << " ";
89d86ed7fbStbbdev }
90d86ed7fbStbbdev std::cout << "\n";
91d86ed7fbStbbdev }
92d86ed7fbStbbdev
93d86ed7fbStbbdev return 0;
94d86ed7fbStbbdev }
95