#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
const int MAXN = 1e6 + 10;
char s[MAXN], t[MAXN];
int n, m, q;
namespace solver1 {
namespace sam {
const int SIZE = 2e6;
struct Node {
int tranc[26];
int fa, dep;
int ver, cnt, to;
}tree[SIZE];
int root, cnt, tail, tot;
int tot_time;
std::vector <int> pts;
Node backup[MAXN];
void insert(int x) {
int p = tail, np = ++cnt;
tree[np].dep = tree[p].dep + 1;
for (; p && !tree[p].tranc[x]; p = tree[p].fa) tree[p].tranc[x] = np;
if (!p) {
tree[np].fa = root;
} else {
int q = tree[p].tranc[x];
if (tree[q].dep == tree[p].dep + 1) {
tree[np].fa = q;
} else {
int nq = ++cnt;
tree[nq] = tree[q];
tree[nq].dep = tree[p].dep + 1;
tree[q].fa = tree[np].fa = nq;
for (; p && tree[p].tranc[x] == q; p = tree[p].fa) tree[p].tranc[x] = nq;
}
}
tail = np;
}
void init() {
tail = root = cnt = 1;
for (int i = 1; i <= n; i++) {
insert(s[i] - 'a');
}
for (int i = 1; i <= cnt; i++) {
tree[i].cnt = 1;
tree[i].to = i;
}
tot = cnt;
std::copy(tree + 1, tree + cnt + 1, backup + 1);
}
void copy_node(int &x) {
return;
if (tree[x].ver != tot_time) {
int u = ++cnt;
tree[u] = tree[x];
tree[u].ver = tot_time;
tree[u].to = u;
tree[x].ver = tot_time;
tree[x].to = u;
if (x == root) {
root = u;
}
x = u;
} else {
x = tree[x].to;
}
}
int newnode() {
int u = ++cnt;
memset(tree + u, 0, sizeof tree[u]);
tree[u].ver = tot_time;
pts.push_back(u);
return u;
}
void insert2(int x) {
int p = tail, np;
if (!tree[p].tranc[x]) {
np = newnode();
} else {
np = tree[p].tranc[x];
if (tree[np].dep != tree[p].dep + 1) {
copy_node(np);
int nq = newnode();
tree[nq] = tree[np];
tree[nq].dep = tree[p].dep + 1;
tree[np].fa = nq;
for (; p && tree[p].tranc[x] == np; p = tree[p].fa) {
copy_node(p);
tree[p].tranc[x] = nq;
}
tail = nq;
} else {
tail = np;
}
return;
}
tree[np].dep = tree[p].dep + 1;
for (; p && !tree[p].tranc[x]; p = tree[p].fa) {
copy_node(p);
tree[p].tranc[x] = np;
}
if (!p) {
tree[np].fa = root;
} else {
int q = tree[p].tranc[x];
if (tree[q].dep == tree[p].dep + 1) {
tree[np].fa = q;
} else {
int nq = newnode();
tree[nq] = tree[q];
tree[nq].dep = tree[p].dep + 1;
copy_node(q);
tree[q].fa = tree[np].fa = nq;
for (; p && tree[p].tranc[x] == q; p = tree[p].fa) {
copy_node(p);
tree[p].tranc[x] = nq;
}
}
}
tail = np;
}
long long query() {
++tot_time;
cnt = tot;
root = 1;
tail = root;
std::copy(backup + 1, backup + cnt + 1, tree + 1);
pts.clear();
for (int i = 1; i <= m; i++) {
insert2(t[i] - 'a');
}
long long ans = 0;
for (int i = 0; i < (int) pts.size(); i++) {
int k = pts[i];
if (!tree[k].cnt) {
ans += tree[k].dep - tree[tree[k].fa].dep;
}
}
return ans;
}
}
void main() {
sam::init();
while(q--) {
int l, r;
scanf("%s%d%d", t + 1, &l, &r);
m = strlen(t + 1);
printf("%lld\n", sam::query());
}
}
}
int main() {
//freopen("name.in", "r", stdin);
//freopen("name.out", "w", stdout);
scanf("%s", s + 1);
n = strlen(s + 1);
scanf("%d", &q);
solver1::main();
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 1.913 ms | 160 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #2 | 3.124 ms | 464 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #3 | 3.232 ms | 468 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #4 | 26.495 ms | 956 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #5 | 25.64 ms | 944 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #6 | 137.53 ms | 287 MB + 304 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #7 | 137.326 ms | 287 MB + 256 KB | Accepted | Score: 4 | 显示更多 |
| Testcase #8 | 4 s | 40 MB + 852 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #9 | 4 s | 33 MB + 412 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #10 | 4 s | 76 MB + 64 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #11 | 4 s | 66 MB + 452 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #12 | 4 s | 111 MB + 296 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #13 | 4 s | 101 MB + 780 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #14 | 4 s | 147 MB + 884 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #15 | 4 s | 138 MB + 20 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #16 | 4 s | 184 MB + 536 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #17 | 4 s | 175 MB + 132 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #18 | 4 s | 84 MB + 972 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #19 | 4 s | 117 MB + 424 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #20 | 4 s | 150 MB + 504 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #21 | 4 s | 184 MB + 768 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #22 | 4 s | 184 MB + 472 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #23 | 4 s | 184 MB + 360 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #24 | 4 s | 184 MB + 716 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #25 | 4 s | 184 MB + 780 KB | Time Limit Exceeded | Score: 0 | 显示更多 |