QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#862845#552. 字符串匹配问题rlc202204#0 1ms8020kbC++142.9kb2025-01-19 10:15:182025-01-19 10:15:27

Judging History

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

  • [2025-01-19 10:15:27]
  • 评测
  • 测评结果:0
  • 用时:1ms
  • 内存:8020kb
  • [2025-01-19 10:15:18]
  • 提交

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%