Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- typedef unsigned long long ull;
- typedef long long ll;
- #define fast ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
- using namespace std;
- const ull mod = 1e9 + 289;
- const int p1 = 1000199, p2 = 1000289;
- vector<ull> deg1, deg2;
- ull get_hash1(int l, int r, vector<ull> &h) {
- return h[r] - h[l] * deg1[r - l];
- }
- ull get_hash2(int l, int r, vector<ull> &h) {
- return h[r] - h[l] * deg2[r - l] % mod;
- }
- int main() {
- fast
- int n, m;
- cin >> n >> m;
- vector<int> a(2 * n);
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- a[2 * n - i - 1] = a[i];
- }
- // считаем степени p
- deg1.resize(2 * n + 1); deg2.resize(2 * n + 1);
- deg1[0] = 1; deg2[0] = 1;
- for (int i = 0; i < 2 * n; ++i) {
- deg1[i + 1] = deg1[i] * p1;
- deg2[i + 1] = (deg2[i] * p2) % mod;
- }
- // считаем хеши
- vector<ull> h1(2 * n + 1), h2(2 * n + 1);
- h1[0] = 0; h2[0] = 0;
- for (int i = 0; i < 2 * n; ++i) {
- h1[i + 1] = h1[i] * p1 + a[i];
- h2[i + 1] = (h2[i] * p2 % mod + a[i]) % mod;
- }
- // сравниваем подстроки
- for (int i = (n + 1) / 2; i < n; ++i) {
- if (get_hash1(2 * i - n, i, h1) == get_hash1(n, 2 * n - i, h1) && get_hash2(2 * i - n, i, h2) == get_hash2(n, 2 * n - i, h2)) {
- cout << i << " ";
- }
- }
- cout << n << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement