structnode { int trans[M], slink; int sst, lst; };
int n; char s[N]; node sam[N << 1];
intnewnode(int sst, int lst, int *trans, int slink) { sam[n].sst = sst; sam[n].lst = lst; sam[n].slink = slink; if (trans) memcpy(sam[n].trans, trans, sizeof(sam[n].trans)); elsememset(sam[n].trans, -1, sizeof(sam[n].trans)); return n++; }
intinsert(int c, int u) { int z = newnode(-1, sam[u].lst + 1, 0, -1), v = u; while(-1 != v && -1 == sam[v].trans[c]) { sam[v].trans[c] = z; v = sam[v].slink; } if (-1 == v) { sam[z].sst = 1; sam[z].slink = 0; return z; } int x = sam[v].trans[c]; if (sam[v].lst + 1 == sam[x].lst) { sam[z].sst = sam[x].lst + 1; sam[z].slink = x; return z; } int y = newnode(-1, sam[v].lst + 1, sam[x].trans, sam[x].slink); sam[x].sst = sam[y].lst + 1; sam[x].slink = y; sam[z].sst = sam[y].lst + 1; sam[z].slink = y; while (-1 != v && sam[v].trans[c] == x) { sam[v].trans[c] = y; v = sam[v].slink; } sam[y].sst = sam[sam[y].slink].lst + 1; return z; }
intmain() { scanf("%s", s + 1); int u = newnode(0, 0, 0, -1), len = strlen(s + 1); for (int i = 1; i <= len; i++) u = insert(s[i] - 'a', u); ll res = 0; for (int i = 1; i < n; i++) { ll t = sam[i].lst - sam[i].sst + 1; res += t; } printf("%lld", res); return0; }
structnode { int trans[M], slink; int sst, lst, flag; ll edpos; };
structEdge { int to, nex; };
int n, cnt, head[N]; ll imax[N], res[N]; char s[N]; node sam[N << 1]; Edge edge[2 * N];
voidadd_edge(int u, int v) { edge[++cnt].to = v; edge[cnt].nex = head[u]; head[u] = cnt; }
voidbuild() { for (int i = 1; i < n; i++) { int to = sam[i].slink; if (-1 != to) { add_edge(i, to); add_edge(to, i); } } }
voiddfs(int u, int fa) { for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; if (v == fa) continue; dfs(v, u); sam[u].edpos += sam[v].edpos; } }
intnewnode(int sst, int lst, int *trans, int slink, int flag) { sam[n].sst = sst; sam[n].lst = lst; sam[n].slink = slink; sam[n].flag = flag; sam[n].edpos = flag; if (trans) memcpy(sam[n].trans, trans, sizeof(sam[n].trans)); elsememset(sam[n].trans, -1, sizeof(sam[n].trans)); return n++; }
intinsert(int c, int u) { int z = newnode(-1, sam[u].lst + 1, 0, -1, 1), v = u; while(-1 != v && -1 == sam[v].trans[c]) { sam[v].trans[c] = z; v = sam[v].slink; } if (-1 == v) { sam[z].sst = 1; sam[z].slink = 0; return z; } int x = sam[v].trans[c]; if (sam[v].lst + 1 == sam[x].lst) { sam[z].sst = sam[x].lst + 1; sam[z].slink = x; return z; } int y = newnode(-1, sam[v].lst + 1, sam[x].trans, sam[x].slink, 0); sam[x].sst = sam[y].lst + 1; sam[x].slink = y; sam[z].sst = sam[y].lst + 1; sam[z].slink = y; while (-1 != v && sam[v].trans[c] == x) { sam[v].trans[c] = y; v = sam[v].slink; } sam[y].sst = sam[sam[y].slink].lst + 1; return z; }
intmain() { scanf("%s", s + 1); int u = newnode(0, 0, 0, -1, 1), len = strlen(s + 1); for (int i = 1; i <= len; i++) u = insert(s[i] - 'a', u); build(); dfs(0, -1); for (int i = 1; i < n; i++) res[sam[i].lst] = max(res[sam[i].lst], sam[i].edpos); for (int i = len - 1; i >= 1; i--) res[i] = max(res[i], res[i + 1]); for (int i = 1; i <= len; i++) printf("%lld\n", res[i]); return0; }
constint N = 2000010; constint M = 11; const ll mod = 1000000007;
structnode { int trans[M], slink; int sst, lst; ll sum, vnum; };
node sam[N << 1]; int T, n, cal[N], len, deg[N]; char s[N];
intnewnode(int sst, int lst, int *trans, int slink) { sam[n].sst = sst; sam[n].lst = lst; sam[n].slink = slink; if (trans) memcpy(sam[n].trans, trans, sizeof(sam[n].trans)); elsememset(sam[n].trans, -1, sizeof(sam[n].trans)); return n++; }
intinsert(int c, int u) { int z = newnode(-1, sam[u].lst + 1, 0, -1), v = u; while(-1 != v && -1 == sam[v].trans[c]) { sam[v].trans[c] = z; v = sam[v].slink; } if (-1 == v) { sam[z].sst = 1; sam[z].slink = 0; return z; } int x = sam[v].trans[c]; if (sam[v].lst + 1 == sam[x].lst) { sam[z].sst = sam[x].lst + 1; sam[z].slink = x; return z; } int y = newnode(-1, sam[v].lst + 1, sam[x].trans, sam[x].slink); sam[x].sst = sam[y].lst + 1; sam[x].slink = y; sam[z].sst = sam[y].lst + 1; sam[z].slink = y; while (-1 != v && sam[v].trans[c] == x) { sam[v].trans[c] = y; v = sam[v].slink; } sam[y].sst = sam[sam[y].slink].lst + 1; return z; }
voidtopsort() { for (int i = 0; i < n; i++) { for (int j = 0; j < M; j++) { if (-1 == sam[i].trans[j]) continue; deg[sam[i].trans[j]]++; } } stack<int> st; st.push(0); sam[0].vnum = 1; while (!st.empty()) { int t = st.top(); st.pop(); for (int i = 0; i < M; i++) { int to = sam[t].trans[i]; if (-1 == to) continue; if (10 != i) sam[to].vnum += sam[t].vnum; if (0 == --deg[to]) st.push(to); } } }
ll solve() { for (int i = 0; i < n; i++) { for (int j = 0; j < M; j++) { if (-1 == sam[i].trans[j]) continue; deg[sam[i].trans[j]]++; } } stack<int> st; st.push(0); while (!st.empty()) { int t = st.top(); st.pop(); for (int i = 0; i < M; i++) { int to = sam[t].trans[i]; if (-1 == to) continue; if (10 != i) { sam[to].sum += (sam[t].sum * 10 + sam[t].vnum * i); sam[to].sum %= mod; } if (0 == --deg[to]) st.push(to); } } ll res = 0; for (int i = 1; i < n; i++) { res += sam[i].sum; res %= mod; } return res; }
intmain() { scanf("%d", &T); while (T--) { scanf("%s", s + 1); int L = strlen(s + 1); for (int i = 1; i <= L; i++) { cal[++len] = s[i] - '0'; s[i] = '\0'; } if (0 != T) cal[++len] = 10; } int u = newnode(0, 0, 0, -1); for (int i = 1; i <= len; i++) u = insert(cal[i], u); topsort(); printf("%lld\n", solve()); return0; }
voidadd_edge(int u, int v) { edge[++cnt].to = v; edge[cnt].nex = head[u]; head[u] = cnt; }
voidbuild() { for (int i = 1; i < n; i++) { int to = sam[i].slink; if (-1 != to) { add_edge(i, to); add_edge(to, i); } } }
voiddfs(int u, int fa) { for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; if (v == fa) continue; dfs(v, u); sam[u].edpos += sam[v].edpos; } }
intnewnode(int sst, int lst, int *trans, int slink, int flag) { sam[n].sst = sst; sam[n].lst = lst; sam[n].slink = slink; sam[n].flag = flag; sam[n].edpos = flag; if (trans) memcpy(sam[n].trans, trans, sizeof(sam[n].trans)); elsememset(sam[n].trans, -1, sizeof(sam[n].trans)); return n++; }
intinsert(int c, int u) { int z = newnode(-1, sam[u].lst + 1, 0, -1, 1), v = u; while(-1 != v && -1 == sam[v].trans[c]) { sam[v].trans[c] = z; v = sam[v].slink; } if (-1 == v) { sam[z].sst = 1; sam[z].slink = 0; return z; } int x = sam[v].trans[c]; if (sam[v].lst + 1 == sam[x].lst) { sam[z].sst = sam[x].lst + 1; sam[z].slink = x; return z; } int y = newnode(-1, sam[v].lst + 1, sam[x].trans, sam[x].slink, 0); sam[x].sst = sam[y].lst + 1; sam[x].slink = y; sam[z].sst = sam[y].lst + 1; sam[z].slink = y; while (-1 != v && sam[v].trans[c] == x) { sam[v].trans[c] = y; v = sam[v].slink; } sam[y].sst = sam[sam[y].slink].lst + 1; return z; }
intsolve() { memset(vis, 0, sizeof(vis)); int res = 0, u = 0, l = 0; for (int i = 1; i <= len; i++) { int c = t[i] - 'a'; while (u && -1 == sam[u].trans[c]) { u = sam[u].slink; l = sam[u].lst; } if (-1 != sam[u].trans[c]) { u = sam[u].trans[c]; l++; } else u = l = 0; if (l > lt) { while (sam[sam[u].slink].lst >= lt) { u = sam[u].slink; l = sam[u].lst; } } if (l >= lt && 0 == vis[u]) { vis[u] = 1; res += sam[u].edpos; } } return res; }
intmain() { scanf("%s", s + 1); int u = newnode(0, 0, 0, -1, 1), ls = strlen(s + 1); for (int i = 1; i <= ls; i++) u = insert(s[i] - 'a', u); build(); dfs(0, -1); scanf("%d", &T); while (T--) { scanf("%s", t + 1); lt = strlen(t + 1); len = lt; for (int i = 1; i < lt; i++) t[++len] = t[i]; printf("%d\n", solve()); for (int i = 1; i <= len; i++) t[i] = '\0'; } return0; }
structnode { int trans[M], slink; int sst, lst, flag; ll edpos; };
structEdge { int to, nex; };
int n, T, cnt, head[N]; ll l, r; char s[N]; node sam[N << 1]; Edge edge[2 * N];
voidadd_edge(int u, int v) { edge[++cnt].to = v; edge[cnt].nex = head[u]; head[u] = cnt; }
voidbuild() { for (int i = 1; i < n; i++) { int to = sam[i].slink; if (-1 != to) { add_edge(i, to); add_edge(to, i); } } }
voiddfs(int u, int fa) { for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; if (v == fa) continue; dfs(v, u); sam[u].edpos += sam[v].edpos; } }
intnewnode(int sst, int lst, int *trans, int slink, int flag) { sam[n].sst = sst; sam[n].lst = lst; sam[n].slink = slink; sam[n].flag = flag; sam[n].edpos = flag; if (trans) memcpy(sam[n].trans, trans, sizeof(sam[n].trans)); elsememset(sam[n].trans, -1, sizeof(sam[n].trans)); return n++; }
intinsert(int c, int u) { int z = newnode(-1, sam[u].lst + 1, 0, -1, 1), v = u; while(-1 != v && -1 == sam[v].trans[c]) { sam[v].trans[c] = z; v = sam[v].slink; } if (-1 == v) { sam[z].sst = 1; sam[z].slink = 0; return z; } int x = sam[v].trans[c]; if (sam[v].lst + 1 == sam[x].lst) { sam[z].sst = sam[x].lst + 1; sam[z].slink = x; return z; } int y = newnode(-1, sam[v].lst + 1, sam[x].trans, sam[x].slink, 0); sam[x].sst = sam[y].lst + 1; sam[x].slink = y; sam[z].sst = sam[y].lst + 1; sam[z].slink = y; while (-1 != v && sam[v].trans[c] == x) { sam[v].trans[c] = y; v = sam[v].slink; } sam[y].sst = sam[sam[y].slink].lst + 1; return z; }
intmain() { while (scanf("%s%lld%lld", s + 1, &l, &r) != EOF) { int u = newnode(0, 0, 0, -1, 1), ls = strlen(s + 1); for (int i = 1; i <= ls; i++) u = insert(s[i] - 'A', u); build(); dfs(0, -1); ll res = 0; for (int i = 1; i < n; i++) if (sam[i].edpos >= l && sam[i].edpos <= r) res += sam[i].lst - sam[i].sst + 1; printf("%lld\n", res); memset(sam, 0, sizeof(sam)); memset(s, '\0', sizeof(s)); memset(head, 0, sizeof(head)); cnt = n = 0; } }