#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#define maxn 2000001
char pattern[maxn], text[maxn];
int pref[maxn], n, m, maxSolNr;
vector <int> sol;
///construim sirul de prefize pt pattern
void compute_prefix_table()
{
//pref[1]=0;
int k;
for(int i=2; i<=n; i++){
k=pref[k-1];
while(k && pattern[i]!=pattern[k+1])
k=pref[k];
if(pattern[i]==pattern[k+1])
k++;
pref[i]=k;
}
}
int main()
{
int j;//pattern position
fin>>pattern+1>>text+1;
n=strlen(pattern+1);
m=strlen(text+1);
compute_prefix_table();
for(int i=1; i<=m; i++){
while(j && text[i]!=pattern[j+1]){
j=pref[j];
}
if(text[i]==pattern[j+1])
j++;
if(j==n){//daca am ajuns cu j la finalul pattern ului adica l am gasit o data in text
sol.push_back(i-n+1);//valoarea de inceput a acestui matching
}
}
fout<<sol.size()<<endl;
maxSolNr=0;
for(auto it:sol){
fout<<it-1<<' ';
if(++maxSolNr == 1000)
break;
}
return 0;
}