QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#283016#7780. Dark LaTeX vs. Light LaTeXLoging#WA 2ms12252kbC++205.5kb2023-12-13 18:01:522023-12-13 18:01:53

Judging History

你现在查看的是最新测评结果

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2023-12-13 18:01:53]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:12252kb
  • [2023-12-13 18:01:52]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

const int N = 5000 + 5;

string S , T;

vector<vector<int>> solve(const string &a , const string &b , int n , int m) {
	vector<vector<int>> f(n + 2 , vector<int>(m + 2));
	for (int i = n ; i >= 1 ; i--) {
		for (int j = m ; j >= 1 ; j--) {
			if (a[i] == b[j]) {
				f[i][j] = f[i + 1][j + 1] + 1;
			} else {
				f[i][j] = 0;
			}
		}
	}
	return f;
}

const int M = 20000 + 5;

int cnt = 1;
int len[M] , fa[M] , pa[N] , pb[N] , son[M][26];

long long sa[M] , sb[M] , va[M] , vb[M];

vector<int> G[M];

int extend(int c , int last) {
	if (son[last][c]) {
		int p = last , q = son[p][c];
		if (len[p] + 1 == len[q]) return q;
		else {
			int nq = ++cnt; len[nq] = len[p] + 1;
			copy(son[q] , son[q] + 26 , son[nq]);
			fa[nq] = fa[q] , fa[q] = nq;
			for ( ; son[p][c] == q ; p = fa[p]) son[p][c] = nq;
			return nq;
		}
	}
	int np = ++cnt , p = last;
	last = np , len[np] = len[p] + 1;
	for ( ; p and not son[p][c] ; p = fa[p]) son[p][c] = np;
	if (p == 0) fa[np] = 1;
	else {
		int q = son[p][c];
		if (len[q] == len[p] + 1) fa[np] = q;
		else {
			int nq = ++cnt; len[nq] = len[p] + 1;
			copy(son[q] , son[q] + 26 , son[nq]);
			fa[nq] = fa[q] , fa[np] = fa[q] = nq;
			for ( ; son[p][c] == q ; p = fa[p]) son[p][c] = nq;
		}
	}
	return np;
}

void dfs(int u) {
	for (int v : G[u]) {
		dfs(v);
		sa[u] += sa[v];
		sb[u] += sb[v];
	}
}

void dfs1(int u) {
	long long wa = 0 , wb = 0;
	if (sa[u]) wa = 1ll * (len[u] - len[fa[u]]) * sa[u];
	if (sb[u]) wb = 1ll * (len[u] - len[fa[u]]) * sb[u];
	for (int v : G[u]) {

		va[v] += va[u] + wa;
		vb[v] += vb[u] + wb;
		dfs1(v);
	}
}

int ja[N][N] , jb[N][N];

void debug(int u , string s) {
	cout << u << ' ' << s << ' ' << fa[u] << ' ' << len[u] << ' ' << va[u] << ' ' << vb[u] << ' ' << sa[u] << ' ' << sb[u] << endl;
	for (int i = 0 ; i < 26 ; i++) {
		if (son[u][i]) {
			debug(son[u][i] , s + (char)('a' + i));
		}
	}
}

int main() {
	cin.tie(nullptr)->sync_with_stdio(0);
	cin >> S >> T;
	int n = S.size() , m = T.size() + 1;
	S = ' ' + S;
	T = ' ' + T;
	auto f = solve(S , S , n , n);
	auto h = solve(S , T , n , m);
	
	long long ans = 0;
	for (int i = 1 ; i <= n ; i++) {
		for (int j = 1 ; j <= m ; j++) {
			ans += h[i][j];
		}
	}
	
//	cout << "INIT" << ans << endl;
	
	int last = 1;
	for (int i = 1 ; i <= n ; i++) {
		last = extend(S[i] - 'a' , last);
		pa[i] = last , sa[last]++;
	}
	last = 1;
	for (int i = 1 ; i <= m ; i++) {
		last = extend(T[i] - 'a' , last);
		pb[i] = last , sb[last]++;
	}
	for (int i = cnt ; i > 1 ; i--) {
		G[fa[i]].push_back(i);
	}
	dfs(1) , dfs1(1); 
//	debug(1 , "");
	for (int i = 1 ; i <= n ; i++) {
		int p = pa[i] , l = i , j = 0;
		ja[i][j] = p;
		while (l) {
			--l , ++j;
			if (l == len[fa[p]]) p = fa[p];
			ja[i][j] = p;
//			cout << i << ' ' << j << ' ' << l << ' ' << p << endl;
		}
	}
//	for (int i = 1 ; i <= m ; i++) {
//		int p = pb[i] , l = i , j = 0;
//		while (l) {
//			--l , ++j;
//			if (l == len[fa[p]]) p = fa[p];
//			jb[i][j] = p;
//			cout << i << ' ' << j << ' ' << l << ' ' << p << endl;
//		}
//	}
	
	auto solvea = [&](int u , int L) {
//		cout << u << ":" << L << ' ' << len[fa[u]] << ' ' << fa[u] << ' ' << sa[u] << endl;
		if (u == 1) return 0ll;
		long long ret = va[u];
		if (sa[u]) ret += 1ll * (L - len[fa[u]]) * sa[u];
		return ret;
	};
	auto solveb = [&](int u , int L) {
//		cout << u << ":" << L << endl;
		if (u == 1) return 0ll;
		long long ret = vb[u];
		if (sb[u]) ret += 1ll * (L - len[fa[u]]) * sb[u];
		return ret;
	};
	
//	cout << ans << endl;
	
	for (int i = 1 ; i <= n ; i++) {
		for (int j = i + 2 ; j <= n ; j++) {
			int l = f[i][j];
			if (l == 0) continue;
//			cout << i << ' ' << j << ' ' << l << endl;
			int L = i + 1 , R = min(i + f[i][j] - 1 , j - 1);
			int p = ja[j - 1][i] , q = ja[j - 1][R + 1];
//			cout << i << ' ' << j << ' ' << p << ' ' << q << endl;
			ans += solveb(p , j - 1 - i) - solveb(q , j - 1 - R);
		}
	}
	
//	cout << ans << endl;
	
	reverse(S.begin() + 1 , S.end());
	reverse(T.begin() + 1 , T.end());
	
	auto g = solve(T , T , m , m);
	
	for (int i = 1 ; i <= cnt ; i++) {
		G[i].clear();
	}
	cnt = 1 , last = 1;
	memset(fa , 0 , sizeof fa);
	memset(son , 0 , sizeof son);
	memset(sa , 0 , sizeof sa);
	memset(sb , 0 , sizeof sb);
	memset(va , 0 , sizeof va);
	memset(vb , 0 , sizeof vb);
	
	last = 1;
	for (int i = 1 ; i <= n ; i++) {
		last = extend(S[i] - 'a' , last);
		pa[i] = last , sa[last]++;
	}
	last = 1;
	for (int i = 1 ; i <= m ; i++) {
		last = extend(T[i] - 'a' , last);
		pb[i] = last , sb[last]++;
	}
	for (int i = cnt ; i > 1 ; i--) {
		G[fa[i]].push_back(i);
	}
	dfs(1) , dfs1(1);
//	debug(1 , "");
	for (int i = 1 ; i <= m ; i++) {
		int p = pb[i] , l = i , j = 0;
		jb[i][j] = p;
		while (l) {
			--l , ++j;
			if (l == len[fa[p]]) p = fa[p];
			jb[i][j] = p;
//			cout << i << ' ' << j << ' ' << l << ' ' << p << endl;
		}
	}
	
//	swap(S , T);
//	cout << S << ' ' << T << endl; 
	
	for (int i = 1 ; i <= m ; i++) {
		for (int j = i + 2 ; j <= m ; j++) {
			int l = g[i][j];
			if (l == 0) continue;
//			cout << i << ' ' << j << ' ' << l << endl;
			int L = i + 1 , R = min(i + g[i][j] - 1 , j - 1);
			int p = jb[j - 1][i] , q = jb[j - 1][R + 1];
//			cout << i << ' ' << j << ' ' << p << ' ' << q << endl;
//			cout << solvea(p , j - 1 - i) - solvea(q , j - 1 - R - 1) << endl;;
			ans += solvea(p , j - 1 - i) - solvea(q , j - 1 - R - 1);
		}
	}
	cout << ans << '\n';
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 12252kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 0ms
memory: 12044kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 2ms
memory: 9956kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: -100
Wrong Answer
time: 1ms
memory: 9520kb

input:

aaba
ba

output:

5

result:

wrong answer 1st numbers differ - expected: '6', found: '5'