/*
可以对P串进行替换和交换,问T串有多少位置跟P是匹配的 n<=500000
统计下各个字母出现的次数,判断是否相等就可以了
但是要写得好,O(n)
我写得不好,参考watashi的
他用l[i]记录字母出现i次的个数
一开始先存P的l[]数组
然后对于T的字母,判断能否抵消,如果能全部抵消,即k=m,就匹配了
抵消,即l[]全部为0了
*/
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
using namespace std;
const int MAXN = 500500;
const int SIGMA = 256;
char T[MAXN] , P[MAXN];
int l[MAXN] , c[SIGMA];
int main()
{
while(~scanf("%s%s",T,P))
{
int n = strlen(T);
int m = strlen(P);
fill(c,c+SIGMA,0);
for(int i= 0 ; i < m ; i ++)
c[P[i]]++;
fill(l+1,l+1+m,0);
for(int i = 0 ; i < SIGMA ; i ++)
l[c[i]]--;//
int k = count(l+1,l+1+m,0);
vector<int>ans;
fill(c,c+SIGMA,0);
for(int i = 0 ; i < n ; i ++)
{
if(i>=m)//del
{
int &cc = c[T[i-m]];
if(l[cc] == 0)k--;
else if(l[cc] == 1)k++;
l[cc]--;
cc--;
if(cc!=0)
{
if(l[cc] == -1)k++;
else if(l[cc] == 0)k--;
l[cc]++;
}
}
//add
int &cc = c[T[i]];
if(cc!=0)
{
if(l[cc] == 0)k--;
else if(l[cc] == 1)k++;
l[cc]--;
}
cc++;
if(l[cc] == -1)k++;
else if(l[cc] == 0)k--;
l[cc]++;
if(k==m)
{
ans.push_back(i-m+1);
}
}
if(ans.empty())
{
puts("No");
}
else
{
puts("Yes");
for(int i = 0 ; i < ans.size() ; i ++)
{
if(i)
putchar(' ');
printf("%d",ans[i]);
}
puts("");
}
}
return 0;
}