提交记录 3935


用户 题目 状态 得分 用时 内存 语言 代码长度
Joker noi18c. 【NOI2018】你的名字 Runtime Error 44 78.828 ms 55680 KB C++ 2.01 KB
提交时间 评测时间
2018-07-18 19:58:32 2020-07-31 22:04:40
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N = 500032;

char S[N], T[N];
int go[N][26], par[N], len[N], cnt = 1, p = 1, n;

void extend(int c) {
	int np = ++cnt;
	len[np] = len[p] + 1;
	for (; p && !go[p][c]; p = par[p]) go[p][c] = np;
	if (!p) par[np] = 1;
	else {
		int q = go[p][c];
		if (len[q] == len[p] + 1) par[np] = q;
		else {
			int nq = ++cnt;
			par[nq] = par[q];
			len[nq] = len[p] + 1;
			memcpy(go[nq], go[q], sizeof *go);
			for (; p && go[p][c] == q; p = par[p]) go[p][c] = nq;
			par[np] = par[q] = nq;
		}
	}
	p = np;
}

int a[N], b[N], c[N], sa[N];
void SA() {
	int *x = a, *y = b, m = 26;
	memset(c+1, 0, 26*sizeof(int));
	for (int i = 1; i <= n; i++) c[x[i] = T[n-i] ^ '`']++;
	for (int i = 1; i < m; i++) c[i+1] += c[i];
	for (int i = 1; i <= n; i++) sa[c[x[i]]--] = i;
	for (int k = 1; k <= n; k <<= 1) {
		int p = 0;
		for (int i = n-k+1; i <= n; i++) y[++p] = i;
		for (int i = 1; i <= n; i++)
			if (sa[i] > k) y[++p] = sa[i] - k;
		memset(c+1, 0, m*sizeof(int));
		for (int i = 1; i <= n; i++) c[x[i]]++;
		for (int i = 1; i < m; i++) c[i+1] += c[i];
		for (int i = n; i > 0; i--) sa[c[x[y[i]]]--] = y[i];
		std::swap(x, y);
		int u = sa[1];
		x[u] = p = 1;
		for (int i = 2, v = sa[2]; i <= n; u = v, v = sa[++i])
			x[v] = y[u]==y[v] && y[u+k]==y[v+k] ? p : ++p;
		if ((m = p) >= n) break;
	}
}

int rk[N], h[N];
void Height() {
	for (int i = 1; i <= n; i++) rk[sa[i]] = i;
	for (int i = 1, k = 0; i <= n; i++) {
		if (k) k--;
		if (rk[i] > 1) {
			int j = sa[rk[i]-1];
			while (T[n-i-k] == T[n-j-k]) k++;
			h[rk[i]] = k;
		}
	}
}

int main() {
	int q;
	scanf("%s%d",S,&q);
	for (char *s = S; *s; s++)
		extend(*s - 'a');
	for (int i = 0; i < 26; i++)
		go[0][i] = 1;
	len[0] = -1;
	while (q--) {
		scanf("%s%*d%*d",T);
		n = strlen(T);
		SA(); Height();
		int x = 1, l = 0;
		long long ans = 0;
		for (int i = 0; i < n; i++) {
			int c = T[i] - 'a';
			while (!go[x][c]) l = len[x = par[x]];
			x = go[x][c];
			ans += i + 1 - std::max(++l, h[rk[n-i]]);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #11.637 ms92 KBAcceptedScore: 4

Testcase #21.737 ms232 KBAcceptedScore: 4

Testcase #31.813 ms232 KBAcceptedScore: 4

Testcase #420.173 ms292 KBAcceptedScore: 4

Testcase #519.461 ms284 KBAcceptedScore: 4

Testcase #615.356 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #715.351 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #815.624 ms17 MB + 536 KBAcceptedScore: 4

Testcase #915.988 ms14 MB + 268 KBAcceptedScore: 4

Testcase #1032.676 ms32 MB + 456 KBAcceptedScore: 4

Testcase #1137.508 ms28 MB + 120 KBAcceptedScore: 4

Testcase #1255.178 ms47 MB + 396 KBAcceptedScore: 4

Testcase #1365.642 ms42 MB + 860 KBAcceptedScore: 4

Testcase #1425.68 ms54 MB + 288 KBRuntime ErrorScore: 0

Testcase #1526.906 ms54 MB + 288 KBRuntime ErrorScore: 0

Testcase #1625.896 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #1727.121 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #1868.115 ms33 MB + 748 KBWrong AnswerScore: 0

Testcase #1978.828 ms48 MB + 476 KBWrong AnswerScore: 0

Testcase #2025.679 ms54 MB + 288 KBRuntime ErrorScore: 0

Testcase #2125.843 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #2225.828 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #2325.867 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #2425.839 ms54 MB + 384 KBRuntime ErrorScore: 0

Testcase #2525.782 ms54 MB + 384 KBRuntime ErrorScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-17 19:08:06 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠