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