QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#832319 | #8701. Border | Rose_Lu | 0 | 1ms | 7784kb | C++14 | 3.0kb | 2024-12-25 20:28:31 | 2024-12-25 20:28:32 |
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;
}
if(++res > len) return;
// cout << len << ' ' << res << endl;
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 == 4) {
// 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) && check(i - 1)) {
if(s[i + 1] != t[i + 1]) ans[i + 1] = max(ans[i + 1], i);
if(s[n - i] != t[n - i]) 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();
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: 7784kb
input:
cbaababaabacbaababaabacbaabacbaababaabacbaaba dabbababbabaabbafabbgbaabfebaabzababbayaabcac
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 17 17 17 17 17 17 17 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1
result:
wrong answer 7th 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%