提交记录 4119


用户 题目 状态 得分 用时 内存 语言 代码长度
EntropyIncreaser noi18c. 【NOI2018】你的名字 Wrong Answer 68 1.742 s 280344 KB C++ 3.67 KB
提交时间 评测时间
2018-07-18 21:03:09 2020-07-31 22:29:34
#include <cstdio>
#include <cstring>

#include <algorithm>

#define LOG(FMT...) fprintf(stderr, FMT)

typedef long long ll;

using namespace std;

struct Node {
	int a, b, id;
};

struct Seg {
	int l, r, v;
	Seg *ls, *rs;

	void ch(int k, int v) {
		this->v = v;
		if (l == r)
			return;
		if (k <= ls->r)
			ls->ch(k, v);
		else
			rs->ch(k, v);
	}

	int qry(int l, int r) const {
		if (this->l == l && this->r == r)
			return v;
		if (r <= ls->r)
			return ls->qry(l, r);
		if (l >= rs->l)
			return rs->qry(l, r);
		return max(ls->qry(l, ls->r), rs->qry(rs->l, r));
	}
};

const int Q = 100010, N = 2000010, LGN = 21;

int n;
char tmp[N];
int s[N], cnt[N], rk[N], sa[N], ht[N], id[N];
int lgt[N];
int pre[N], suf[N];
int st[N][LGN];
int ql[Q], qr[Q], sl[Q], sr[Q], cur[Q];
ll ans[Q];
Node p[N], q[N];
Seg* seg;

void ins();
int qry(int l, int r);
Seg* build(int l, int r, int v);

int main() {
	int qc;
	ins();
	scanf("%d", &qc);
	for (int i = 1; i <= qc; ++i) {
		ins();
		scanf("%d%d", &ql[i], &qr[i]);
	}
	for (int i = 1; i <= n; ++i)
		cnt[s[i]] = 1;
	for (int i = 1; i <= 26 + qc; ++i)
		cnt[i] += cnt[i - 1];
	for (int i = 1; i <= n; ++i)
		rk[i] = cnt[s[i]];
	for (int t = 1; t <= n; t <<= 1) {
		memset(cnt, 0, sizeof(cnt));
		for (int i = 1; i <= n; ++i) {
			p[i].id = i;
			p[i].a = rk[i];
			p[i].b = i + t > n ? 0 : rk[i + t];
		}
		for (int i = 1; i <= n; ++i)
			++cnt[p[i].b];
		for (int i = 1; i <= n; ++i)
			cnt[i] += cnt[i - 1];
		for (int i = n; i; --i)
			q[cnt[p[i].b]--] = p[i];
		memset(cnt, 0, sizeof(cnt));
		for (int i = 1; i <= n; ++i)
			++cnt[q[i].a];
		for (int i = 1; i <= n; ++i)
			cnt[i] += cnt[i - 1];
		for (int i = n; i; --i)
			p[cnt[q[i].a]--] = q[i];
		int c = 0;
		for (int i = 1; i <= n; ++i) {
			if (p[i].a != p[i - 1].a || p[i].b != p[i - 1].b)
				++c;
			rk[p[i].id] = c;
		}
		if (c == n)
			break;
	}
	for (int i = 1; i <= n; ++i)
		sa[rk[i]] = i;
	int hh = 0;
	for (int i = 1; i <= n; ++i) {
		hh = max(hh - 1, 0);
		while (s[i + hh] == s[sa[rk[i] + 1] + hh])
			++hh;
		ht[rk[i]] = hh;
	}

	for (int i = 1; i <= qc; ++i)
		for (int j = sl[i]; j <= sr[i]; ++j)
			id[rk[j]] = i;

	for (int i = 2; i <= n; ++i)
		lgt[i] = lgt[i >> 1] + 1;
	for (int i = 1; i < n; ++i) {
		st[i][0] = ht[i];
		for (int j = 1; (1 << j) <= i; ++j)
			st[i][j] = min(st[i][j - 1], st[i - (1 << (j - 1))][j - 1]);
	}

	seg = build(1, sr[0], 0);
	for (int i = 1; i <= n; ++i) {
		if (sa[i] <= sr[0])
			seg->ch(sa[i], i);
		else if (id[i])
			pre[i] = seg->qry(ql[id[i]], qr[id[i]]);
	}

	seg = build(1, sr[0], -n - 1);
	for (int i = n; i; --i) {
		if (sa[i] <= sr[0]) {
			seg->ch(sa[i], -i);
		} else if (id[i]) {
			suf[i] = -seg->qry(ql[id[i]], qr[id[i]]);
			if (suf[i] == n + 1)
				suf[i] = 0;
		}
	}

	for(int i = 1; i <= n; ++i) {
		if (!id[i])
			continue;
		int lim = 0;
		if (pre[i])
			lim = max(lim, min(qry(pre[i], i), qr[id[i]] - sa[pre[i]] + 1));
		if (suf[i])
			lim = max(lim, min(qry(i, suf[i]), qr[id[i]] - sa[suf[i]] + 1));
		if (cur[id[i]])
			lim = max(lim, qry(cur[id[i]], i));
		ans[id[i]] -= lim;
		cur[id[i]] = i;
	}

	for (int i = 1; i <= qc; ++i)
		printf("%lld\n", ans[i]);
	return 0;
}

Seg* build(int l, int r, int v) {
	static Seg pool[N * 4];
	static Seg* ptop = pool;
	Seg* p = ptop;
	++ptop;
	p->l = l;
	p->r = r;
	p->v = v;
	if (l == r)
		return p;
	int mid = (l + r) / 2;
	p->ls = build(l, mid, v);
	p->rs = build(mid + 1, r, v);
	return p;
}

int qry(int l, int r) {
	--r;
	int lv = lgt[r - l + 1];
	return min(st[r][lv], st[l + (1 << lv) - 1][lv]);
}

void ins() {
	static int id = 0;
	if (id)
		s[++n] = id + 26;
	scanf("%s", tmp);
	sl[id] = n + 1;
	for (char* c = tmp; *c; ++c)
		s[++n] = *c - 'a' + 1;
	sr[id] = n;
	ans[id] = (sr[id] - sl[id] + 1) * (sr[id] - sl[id] + 2LL) / 2;
	++id;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #17.098 ms12 MB + 740 KBAcceptedScore: 4

Testcase #27.41 ms12 MB + 972 KBAcceptedScore: 4

Testcase #37.613 ms13 MB + 148 KBAcceptedScore: 4

Testcase #491.026 ms72 MB + 92 KBAcceptedScore: 4

Testcase #587.967 ms70 MB + 216 KBAcceptedScore: 4

Testcase #6823.036 ms202 MB + 764 KBAcceptedScore: 4

Testcase #7824.471 ms202 MB + 764 KBAcceptedScore: 4

Testcase #8112.795 ms60 MB + 564 KBAcceptedScore: 4

Testcase #984.18 ms60 MB + 920 KBAcceptedScore: 4

Testcase #10260.981 ms113 MB + 368 KBAcceptedScore: 4

Testcase #11208.352 ms114 MB + 148 KBAcceptedScore: 4

Testcase #12437.7 ms166 MB + 180 KBAcceptedScore: 4

Testcase #13416.463 ms167 MB + 356 KBAcceptedScore: 4

Testcase #14640.877 ms218 MB + 996 KBAcceptedScore: 4

Testcase #15618.321 ms220 MB + 608 KBAcceptedScore: 4

Testcase #16891.898 ms271 MB + 832 KBAcceptedScore: 4

Testcase #17833.64 ms273 MB + 792 KBAcceptedScore: 4

Testcase #181.12 s194 MB + 876 KBWrong AnswerScore: 0

Testcase #191.328 s220 MB + 516 KBWrong AnswerScore: 0

Testcase #201.529 s246 MB + 164 KBWrong AnswerScore: 0

Testcase #211.732 s271 MB + 808 KBWrong AnswerScore: 0

Testcase #221.737 s271 MB + 832 KBWrong AnswerScore: 0

Testcase #231.735 s271 MB + 836 KBWrong AnswerScore: 0

Testcase #241.742 s271 MB + 828 KBWrong AnswerScore: 0

Testcase #251.73 s271 MB + 832 KBWrong AnswerScore: 0


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