QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#832365#8701. BorderRose_Lu0 1ms7764kbC++143.2kb2024-12-25 20:50:392024-12-25 20:50:40

Judging History

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

  • [2024-12-25 20:50:40]
  • 评测
  • 测评结果:0
  • 用时:1ms
  • 内存:7764kb
  • [2024-12-25 20:50:39]
  • 提交

answer

#include <iostream>
#include <cstring>

using namespace std;
typedef long long ll;
const int N = 2e6 + 10;
const ll B = 233, p = 1e9 + 7;

int n, num;
int ans[N];
ll base[N], hs[N];
char s[N], t[N];

bool check (int x) {
	ll x1 = hs[x], x2 = (hs[n] + p - (hs[n - x] * base[x] % p)) % p;
	return x1 == x2;
}

bool check1 (int x, int len) {
	int l = n - len + 1;
	ll x1 = hs[x], x2 = (hs[l + x - 1] + p - (hs[l - 1] * base[x] % p)) % p;
	return x1 == x2;
}

void work(int len) {
	int l = 1, r = len, mid, res = 0;
	while(l <= r) {
		mid = (l + r) >> 1;
		if(check1(mid, len)) l = mid + 1, res = mid;
		else r = mid - 1;
	}
//	cout << len << ' ' << res << endl;
	if(++res > len) return;
	if((res < n - len + 1) && ((hs[len] + p - (s[res] * base[len - res] % p) + (t[res] * base[len - res] % p)) % p == ((hs[n] + p - (hs[n - len] * base[len] % p))) % p))
		ans[res] = max(ans[res], len);
	if((res >= n - len + 1) && ((hs[len] + p - (s[res] * base[len - res] % p) + (t[res] * base[len - res] % p)) % p == (((hs[n] + p - (hs[n - len] * base[len] % p)) % p) + (((t[res] + p - s[res]) % p) * base[n - res] % p)) % p))
		ans[res] = max(ans[res], len);
	if((len < n - len + res) && (hs[len] == ((((hs[n] + p - (hs[n - len] * base[len] % p)) % p) + (((t[n - len + res] + p - s[n - len + res]) % p) * base[len - res] % p)) % p)))
		ans[n - len + res] = max(ans[n - len + res], len);
	if(len == 6) {
		cout << n - len + res << endl;;
		cout << t[n - len + res] << ' ' << s[n - len + res] << endl;
		cout << (hs[len] + (((t[n - len + res] + p - s[n - len + res]) % p) * (base[len - n + len - res]) % p)) % p << ' ' << ((((hs[n] + p - (hs[n - len] * base[len] % p)) % p) + (((t[n - len + res] + p - s[n - len + res]) % p) * base[len - res] % p)) % p) << endl;
		
	}
	if((len >= n - len + res) && ((hs[len] + (((t[n - len + res] + p - s[n - len + res]) % p) * base[len - n + len - res] % p)) % p == ((((hs[n] + p - (hs[n - len] * base[len] % p)) % p) + (((t[n - len + res] + p - s[n - len + res]) % p) * base[len - res] % p)) % p)))
		ans[n - len + res] = max(ans[n - len + res], len);
}

void init () {
	for(int i = n - 1; i; --i)
		if(check(i)) {
			num = i;
			break;
		}
	for(int i = 1; i <= n; ++i)
		if(s[i] == t[i]) ans[i] = num;
	for(int i = 1; i <= n / 2; ++i)
		if(check(i)) {
//			cout << i << endl;
			if((t[i + 1] + (hs[i] * base[1] % p)) % p == ((hs[n] + p - (hs[n - i - 2] * base[i + 1])))) ;
			else ans[i + 1] = max(ans[i + 1], i);
			if(hs[i + 1] == ((t[n - i - 1] * base[i + 1] % p) + hs[n - i]) % p) ;
			else ans[n - i] = max(ans[n - i], i);
		}
	if(num < (n + 1) / 2) {
		for(int i = num + 1; i <= n - num; ++i) {
			if(i == num + 1) {
				if(t[i] != s[n - num]) ans[i] = max(ans[i], num);
			} else if(i == n - num) {
				if(t[i] != s[num + 1]) ans[i] = max(ans[i], num);
			} else ans[i] = max(ans[i], num);
		}
	}
}

int main () {
	cin >> (s + 1) >> (t + 1);
	n = strlen(s + 1);
	base[0] = 1;
	for(int i = 1; i <= n; ++i)
		base[i] = base[i - 1] * B % p, 
		hs[i] = (s[i] + hs[i - 1] * B % p) % p;
	init();
//	cout << n << ' ' << num << endl;
	for(int i = 1; i < n; ++i) 
		work(i);
	for(int i = 1; i <= n; ++i)
		cout << ans[i] << endl;
	return 0;
}

详细

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 7764kb

input:

cbaababaabacbaababaabacbaabacbaababaabacbaaba
dabbababbabaabbafabbgbaabfebaabzababbayaabcac

output:

0
0
0
0
0
0
6
0
0
0
0
0
0
0
0
0
0
17
17
17
17
17
17
17
17
17
17
17
0
0
0
0
0
0
0
0
0
0
6
0
0
0
3
0
1

result:

wrong answer 8th numbers differ - expected: '6', found: '0'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #1:

0%

Subtask #4:

score: 0
Skipped

Dependency #1:

0%