Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- using namespace std;
- typedef signed long long ll;
- typedef unsigned long ui;
- const ll MaxN(19091), mul(7), mod(19e6+7); ll deg[MaxN] = {1};
- struct subcmp {
- char str[MaxN], rtr[MaxN]; ui size;
- ll suff[MaxN] = {}, pref[MaxN] = {};
- void get_deg() {
- for (ll* i(deg + 1); i < deg + size + 19; ++i)
- *i = (*(i - 1) * mul) % mod;
- }
- subcmp (string& s) {
- size = s.size(); get_deg();
- for (ui i(0); i < size; ++i)
- str[i] = rtr[size-i-1] = s[i];
- for (ui i(0); i < size; ++i)
- pref[i + 1] = (pref[i] * mul + str[i]) % mod,
- suff[i + 1] = (suff[i] * mul + rtr[i]) %mod;
- }
- ll get (ll i, ll j, bool rev) {
- if (rev) value = suff[size-j] - suff[size-i-1] * deg[i-j+1];
- else value = pref[j + 1] - pref[i] * deg[j-i+1];
- while (value < 0) value += mod;
- return value;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement