Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <iomanip>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <map>
- #include <string>
- #include <cassert>
- #include <numeric>
- #include <queue>
- #include <cstdint>
- #include <string>
- #include <unordered_map>
- using namespace std;
- #define int long long
- #define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
- const long long INF = 1e18 + 7;
- const double EPS = 1e-9;
- const int N = 5010;
- const int MOD = 1e9 + 7;
- int P = 23039, P1 = 22943;
- int d[N][N];
- int power[N], power1[N];
- int Get(char c) {
- return c - 'a' + 1;
- }
- void MakeHash(string s, vector<pair<int, int>>& hse) {
- hse[0].first = Get(s[0]);
- hse[0].second = Get(s[0]);
- for (int i = 1; i < s.size(); ++i) {
- hse[i].first = (hse[i - 1].first * P + Get(s[i])) % MOD;
- hse[i].second = (hse[i - 1].second * P1 + Get(s[i]) * power1[i]) % MOD;
- }
- }
- bool IsPol(string x) {
- string y = x;
- reverse(y.begin(), y.end());
- return x == y;
- }
- inline void solve() {
- string s;
- int n;
- cin >> s;
- n = s.size();
- string t = s;
- reverse(t.begin(), t.end());
- power[0] = 1;
- power1[0] = 1;
- for (int i = 1; i < n; ++i) {
- power[i] = power[i - 1] * P % MOD;
- power1[i] = power1[i - 1] * P1 % MOD;
- }
- vector<pair<int, int>> pref(n), suff(n);
- MakeHash(s, pref);
- MakeHash(t, suff);
- // for (auto [x, y]: pref) {
- // cout << x << ' ' << y << ' ';
- // }
- // cout << endl;
- // for (auto [x, y]: suff) {
- // cout << x << ' ' << y << ' ';
- // }
- // cout << endl << endl;
- for (int l = 0; l < n; ++l) {
- for (int r = l; r < n; ++r) {
- int l1 = n - 1 - r, r1 = n - 1 - l;
- int x = (pref[r].first - pref[l].first * power[r - l + 1]) % MOD;
- int y = (suff[r1].first - suff[l1].first * power[r1 - l1 + 1]) % MOD;
- int x2 = (pref[r].second - pref[l].second * power1[r - l + 1]) % MOD;
- int y2 = (suff[r1].second - suff[l1].second * power1[r1 - l1 + 1]) % MOD;
- if (x == y && x2 == y2) {
- d[l][r] = 1;
- }
- }
- }
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- cout << d[i][j] << ' ';
- }
- cout << endl;
- }
- for (int i = 0; i < n; ++i) {
- d[i][i] = 1;
- }
- for (int i = 1; i < n; ++i) {
- for (int x = 0, y = i; y < n; ++x, ++y) {
- d[x][y] += d[x + 1][y] + d[x][y - 1] - d[x + 1][y - 1];
- }
- }
- int q;
- cin >> q;
- while (q--) {
- int x, y;
- cin >> x >> y;
- cout << d[x - 1][y - 1] << ' ';
- }
- }
- int32_t main() {
- IOS;
- int tt = 1;
- // cin >> t;
- while (tt--) {
- solve();
- }
- return 0;
- }
- /*
- 1. 数组开够了没
- 2. 文件名写对了没,文件夹建了吗
- 3. 内存会不会MLE
- 4. 多测清空?
- 5. 调试删干净了没
- 6. 取模有没有溢出
- 7. 快速幂底数要取模,幂对 mod-1 取模
- 8. 前向星和欧拉序要开2倍数组
- 9. 比较函数如果值相同的话有没有第二优先级
- 10. 线段树 4 倍空间,线段树合并和可持久化线段树 32 倍空间
- 11. 看清楚 log 的底数是啥,log后面的数是啥
- 12. long long 只有正负 2^63-1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement