#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 都能跑过去。