| 记录编号 | 283469 | 评测结果 | AATAAAAAAAA | 
    
        | 题目名称 | 2216.[BZOJ 4503] 你猜是不是KMP | 最终得分 | 90 | 
    
        | 用户昵称 |  阮行止 | 是否通过 | 未通过 | 
    
        | 代码语言 | C++ | 运行时间 | 2.443 s | 
    
        | 提交时间 | 2016-07-14 19:06:15 | 内存使用 | 0.83 MiB | 
    
    
    
    		显示代码纯文本
		
		#include "cstdio"
#include "cstdlib"
#include "iostream"
#include "algorithm"
#include "cstring"
#include "bitset"
#include "queue"
using namespace std;
#define INF 0x3F3F3F3F
#define MAX_SIZE 100005
#define Eps
#define Mod
#define Get(x, a) (x ? x -> a : 0)
#define Travel(x) for(typeof(x.begin()) it = x.begin(); it != x.end(); ++it)
inline int Get_Int()
{
	int Num = 0, Flag = 1;
	char ch;
	do
	{
		ch = getchar();
		if(ch == '-')
			Flag = -Flag;
	}
	while(ch < '0' || ch > '9');
	do
	{
		Num = Num * 10 + ch - '0';
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9');
	return Num * Flag;
}
int N, M, Sum;
int Last[26];
char S1[MAX_SIZE], S2[MAX_SIZE];
bitset<MAX_SIZE> Position[26], Ans;
int main()
{
	freopen("guess.in", "r", stdin);
	freopen("guess.out", "w", stdout);
	scanf("%s", S1);
	scanf("%s", S2);
	N = strlen(S1);
	M = strlen(S2);
	for(int i = 0; i < N; ++i)
		Ans[i] = Position[S1[i] - 'a'][i] = 1;
	for(int i = 0; i < M; ++i)
	{
		if(S2[i] == '?')
			continue;
		int Now = S2[i] - 'a';
		Position[Now] >>= i - Last[Now];
		Last[Now] = i;
		Ans &= Position[Now];
	}
	for(int i = 0; i < N - M + 1; ++i)
		if(Ans[i])
			++Sum;
	cout << Sum << endl;
	for(int i = 0; i < N - M + 1; ++i)
		if(Ans[i])
			printf("%d\n", i);
	fclose(stdin);
	fclose(stdout);
	return 0;
}