QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#541601#7780. Dark LaTeX vs. Light LaTeXAmiyaCastML 2ms14352kbC++142.5kb2024-08-31 20:09:082024-08-31 20:09:08

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-08-31 20:09:08]
  • 评测
  • 测评结果:ML
  • 用时:2ms
  • 内存:14352kb
  • [2024-08-31 20:09:08]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
#define pii make_pair
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,b,a) for(int i=b;i>=a;--i)
const ll inf = 1145141919810;
using namespace std;
inline ll read() {
	ll x=0,f=1;
	char c=getchar();
	while (c<'0' || c>'9') {
		if (c=='-')  f=-1;
		c=getchar();
	}
	while (c>='0' && c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
inline void print(ll x) {
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) print(x / 10);
	putchar(x % 10 + '0');
	return ;
}
inline void pprint(ll x) {
	print(x);
	puts("");
}

const int N = 5010;
ll f[N][N];
ll g[N][N];
int lcp[N][N];
int lcp1[N][N];
int lcp2[N][N];
int n, m;
char s[N], t[N];
void init() {
	scanf("%s", s + 1);
	scanf("%s", t + 1);
	n = strlen(s + 1);
	m = strlen(t + 1);
	for(int i = n; i >= 1; --i) {
		for(int j = m; j >= 1; --j) {
			if(s[i] == t[j]) {
				lcp[i][j] = lcp[i + 1][j + 1] + 1;
			}
		}
	}
	per(i, n, 1) {
		per(j, n, 1) {
			if(s[i] == s[j]) {
				lcp1[i][j] = lcp1[i + 1][j + 1] + 1;
			}
		}
	}
	per(i, m, 1) {
		per(j, m, 1) {
			if(t[i] == t[j]) {
				lcp2[i][j] = lcp2[i + 1][j + 1] + 1;
			}
		}
	}
	
	rep(i, 1, n) { //统计lcp的数目
		rep(j, 1, m) {
			f[i][lcp[i][j]]++;//从i开始有一个lcp是lcp[i][j]的lcp
		}
	}
	rep(i, 1, n) {
		per(j, 5000, 0) {
			f[i][j] += f[i][j + 1];
		}
	}
	per(i, n, 1) {
		rep(j, 1, 5000) {
			f[i][j] += f[i + 1][j - 1];
		}
	}

	rep(j, 1, m) {
		rep(i, 1, n) {
			g[j][lcp[i][j]]++;
		}
	}
	rep(j, 1, m) {
		per(i, 5000, 0) {
			g[j][i] += g[j][i + 1];
		}
	}
	per(j, m, 1) {
		rep(i, 1, 5000) {
			g[j][i] += g[j + 1][i - 1];
		}
	}
}


void slv() {
	ll ans = 0;
	rep(i, 1, n) rep(j, 1, m) ans += lcp[i][j];
//	rep(i, 1, n){
//		rep(j, 0, n){
//			cout << f[i][j] << " ";
//		}
//		puts("");
//	}
//    cout << ans << endl;
	rep(i, 1, n) {
		rep(j, i + 2, n) {//i j是两个端点
//			cout << "i = " << i << ", j = " << j << endl;
			int r = min(j, i + lcp1[i][j] + 1);//r是禁止端点
			int len = j - i - 1;
//			cout << "r = " << r << ", len = " << len << endl;
			ans += f[i + 1][len] - f[r][len - (r - (i + 1))];
//			cout << ans << endl;
		}
	}
//	cout << ans << endl;
	rep(i, 1, m) {
		rep(j, i + 2, m) {//i j是两个端点
			int r = min(j, i + lcp2[i][j] + 1);//r是禁止端点
			int len = j - i - 1;
			ans += g[i + 1][len] - g[r][len - (r - (i + 1))];
		}
	}
	pprint(ans);
}
int main() {
	init();
	slv();
	return 0;
}

详细

Test #1:

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

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

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

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 1ms
memory: 7692kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

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

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Memory Limit Exceeded

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

78156256250000

result: