QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#862845 | #552. 字符串匹配问题 | rlc202204# | 0 | 1ms | 8020kb | C++14 | 2.9kb | 2025-01-19 10:15:18 | 2025-01-19 10:15:27 |
answer
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 3e5 + 5;
const int mod = 998244353;
#define debug(x) cout << #x << "=" << x << endl
int fpow(int a, int b, int p) {
if (b == 0)
return 1;
int ans = fpow(a, b / 2, p);
ans = 1ll * ans * ans % p;
if (b % 2 == 1)
ans = 1ll * a * ans % p;
return ans;
}
int mmi(int a, int p) {
return fpow(a, p - 2, p);
}
int rev[N * 4] = {0};
void NTT(int *a, int lim, int op) {
for (int i = 0; i < lim; i++)
if (i < rev[i])
swap(a[i], a[rev[i]]);
for (int i = 1; i < lim; i <<= 1) {
int wn = fpow((op == 1 ? 3 : (mod + 1) / 3), (mod - 1) / (i << 1), mod);
for (int j = 0; j < lim; j += (i << 1)) {
int w = 1;
for (int k = 0; k < i; k++, w = 1ll * w * wn % mod) {
int x = a[j + k], y = 1ll * w * a[i + j + k] % mod;
a[j + k] = (x + y) % mod, a[i + j + k] = (x - y + mod) % mod;
}
}
}
if (op == -1) {
int invlim = mmi(lim, mod);
for (int i = 0; i < lim; i++)
a[i] = 1ll * invlim * a[i] % mod;
}
}
int f[N * 4] = {0}, g[N * 4] = {0};
void mul(int n, int m) {
int len = n + m - 1;
int lim = 1, pw = 0;
while (lim < len)
lim <<= 1, pw++;
for (int i = 0; i < lim; i++) {
if (i >= n)
f[i] = 0;
if (i >= m)
g[i] = 0;
rev[i] = ((rev[i >> 1] >> 1) | ((i & 1) << (pw - 1)));
}
/* cout << "F: ";
for (int i = 0; i < n; i++) cout << f[i] << " ";
cout << endl;
cout << "G: ";
for (int i = 0; i < m; i++) cout << g[i] << " ";
cout << endl; */
NTT(f, lim, 1), NTT(g, lim, 1);
for (int i = 0; i < lim; i++)
f[i] = 1ll * f[i] * g[i] % mod;
NTT(f, lim, -1);
// for (int i = 0; i < lim; i++)
// cout << f[i] << " ";
// cout << endl;
}
char s[N], t[N];
int sum[N] = {0};
int main() {
scanf("%s", t);
scanf("%s", s);
int m = strlen(t), n = strlen(s);
for (int i = 0; i < n; i++) s[i] = (s[i] == '*' ? 'a' - 1 : s[i]);
for (int j = 0; j < m; j++) t[j] = (t[j] == '*' ? 'a' - 1 : t[j]);
printf("%s\n", s);
printf("%s\n", t);
for (int i = 0; i < n; i++)
f[i] = (s[i] - 'a' + 1) * (s[i] - 'a' + 1) * (s[i] - 'a' + 1);
for (int i = 0; i < m; i++)
g[m - i - 1] = t[i] - 'a' + 1;
mul(n, m);
for (int i = m - 1; i < n; i++)
sum[i - m + 1] += f[i];
for (int i = 0; i < n; i++)
f[i] = (s[i] - 'a' + 1) * (s[i] - 'a' + 1);
for (int i = 0; i < m; i++)
g[m - i - 1] = (t[i] - 'a' + 1) * (t[i] - 'a' + 1);
mul(n, m);
for (int i = m - 1; i < n; i++)
sum[i - m + 1] -= 2 * f[i];
for (int i = 0; i < n; i++)
f[i] = (s[i] - 'a' + 1);
for (int i = 0; i < m; i++)
g[m - i - 1] = (t[i] - 'a' + 1) * (t[i] - 'a' + 1) * (t[i] - 'a' + 1);
mul(n, m);
for (int i = m - 1; i < n; i++)
sum[i - m + 1] += f[i];
for (int i = 0; i <= n - m; i++)
if (sum[i] == 0)
printf("%d ", i + 1);
return 0;
}
/*
a[i]b[i](a[i] - b[i])^2
a^3b -2a^2b^2 ab^3
*/
詳細信息
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 8020kb
input:
cabacacccbacccaabacacaabcabbabcaccbcabbacbcb aaaccabacaaabb*abaaaa*bcabacacccba*ccaabacadaabcabba*kac*b*abbacabacacccbacccaa*acacaabcabbabca***cabbacbcbcabbacbcbbccbcacbaccbacaacc***bbbabccc**bbcbaaaaaabaabaacbc*cbcca*ccbabbacb*caaabcaba*acccbacccaabcabadac*cbacccaabacacaabca**abcucc*cxbbacb*bbacacc...
output:
aaaccabacaaabb`abaaaa`bcabacacccba`ccaabacadaabcabba`kac`b`abbacabacacccbacccaa`acacaabcabbabca```cabbacbcbcabbacbcbbccbcacbaccbacaacc```bbbabccc``bbcbaaaaaabaabaacbc`cbcca`ccbabbacb`caaabcaba`acccbacccaabcabadac`cbacccaabacacaabca``abcucc`cxbbacb`bbacaccabacac`cbacccaabac`c`abcab`ab`accbcabba`bcbca...
result:
wrong output format Expected integer, but "aaaccabacaaabb`abaaaa`bcabacac...bbabm`ccbcabbacbcbccaabbc`bacaa" found
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%