建议加强数据
查看原帖
建议加强数据
388651
5k_sync_closer楼主2023/5/17 16:44
#include <cstdio>
#include <bitset>
using namespace std;
bitset<300001> v, p[26];
int n, m, c, q[300050];char a[300050], b[300050];
int main()
{
	scanf("%d%d%s%s", &m, &n, a + 1, b + 1);
	for(int i = 1;i <= n;++i)
		if(b[i] != '*') p[b[i] - 'a'].set(i);
		else for(int j = 0;j < 26;++j) p[j].set(i);
	v.set();if(a[1] != '*') v &= p[a[1] - 'a'];
	for(int i = 2;i <= min(m, 120000);++i) //乱搞
		{v <<= 1;if(a[i] != '*') v &= p[a[i] - 'a'];}
	for(int i = m;i <= n;++i)
		if(v[i]) q[++c] = i - m + 1;
	printf("%d\n", c);
	for(int i = 1;i <= c;++i) printf("%d ", q[i]);
	return 0;
}

卡了直接 bitset,于是考虑少 shift-and 几次。

120000 这个数比较接近最优次数,实际上取 200000 都能跑过去。

https://www.luogu.com.cn/record/110573064

2023/5/17 16:44
加载中...