#include<iostream>
#include<string>
#include<vector>
class Word
{
std::string word;
std::string pattern;
std::string buf;
int size;
public:
std::vector <int> lookForPatterns();
Word(std::string &w, std::string &p, int s);
Word();
~Word();
};
std::vector <int> Word::lookForPatterns()
{
std::vector <int> results;
buf.clear();
int start = 0;
if (pattern.empty() == true)
{
for(int i = 0; i<word.size();i++)
results.push_back(i);
}
for (int i = 0; i <= word.size() - 1; i++)
{
if (buf.empty() == true)
{
start = i;
}
buf += word.at(i);
for (int j = 0; j <= buf.size() - 1; j++)
{
if (buf.at(j) != pattern.at(j))
{
buf.clear();
break;
}
else
{
if (buf.size() == pattern.size())
{
if (buf == pattern)
{
results.push_back(start);
buf.clear();
i = start;
break;
}
else
{
buf.clear();
break;
}
}
else
break;
}
}
}
return results;
}
Word::Word(std::string &w, std::string &p, int s)
{
word = w;
pattern = p;
size = s;
}
Word::Word()
{
}
Word::~Word()
{
word.clear();
pattern.clear();
}
int main()
{
std::vector<int> positions;
std::string _word;
std::string _pattern;
int s;
int n;
std::cin >> n;
for (int i = 0; i < n; i++)
{
std::cin >> s >> _pattern >> _word;
Word p1(_word, _pattern, s);
positions = p1.lookForPatterns();
for (int i = 0; i < positions.size(); i++)
{
std::cout << positions[i] << std::endl;
}
positions.clear();
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8dmVjdG9yPgogCmNsYXNzIFdvcmQKewogICAgc3RkOjpzdHJpbmcgd29yZDsKICAgIHN0ZDo6c3RyaW5nIHBhdHRlcm47CiAgICBzdGQ6OnN0cmluZyBidWY7CiAgICBpbnQgc2l6ZTsKcHVibGljOgogICAgc3RkOjp2ZWN0b3IgPGludD4gbG9va0ZvclBhdHRlcm5zKCk7CiAgICBXb3JkKHN0ZDo6c3RyaW5nICZ3LCBzdGQ6OnN0cmluZyAmcCwgaW50IHMpOwogICAgV29yZCgpOwogICAgfldvcmQoKTsKfTsKIAogCnN0ZDo6dmVjdG9yIDxpbnQ+IFdvcmQ6Omxvb2tGb3JQYXR0ZXJucygpCnsKICAgIHN0ZDo6dmVjdG9yIDxpbnQ+IHJlc3VsdHM7CiAgICBidWYuY2xlYXIoKTsKCWludCBzdGFydCA9IDA7CglpZiAocGF0dGVybi5lbXB0eSgpID09IHRydWUpCgkJewoJCQlmb3IoaW50IGkgPSAwOyBpPHdvcmQuc2l6ZSgpO2krKykKCQkJCXJlc3VsdHMucHVzaF9iYWNrKGkpOwoJCX0KICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHdvcmQuc2l6ZSgpIC0gMTsgaSsrKQogICAgewogICAgICAgIGlmIChidWYuZW1wdHkoKSA9PSB0cnVlKQogICAgICAgIHsKICAgICAgICAgICAgc3RhcnQgPSBpOwogICAgICAgIH0KICAgICAgICBidWYgKz0gd29yZC5hdChpKTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBidWYuc2l6ZSgpIC0gMTsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGJ1Zi5hdChqKSAhPSBwYXR0ZXJuLmF0KGopKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGJ1Zi5zaXplKCkgPT0gcGF0dGVybi5zaXplKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBwYXR0ZXJuKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2soc3RhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICBidWYuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHN0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7Cn0KV29yZDo6V29yZChzdGQ6OnN0cmluZyAmdywgc3RkOjpzdHJpbmcgJnAsIGludCBzKQp7CiAgICB3b3JkID0gdzsKICAgIHBhdHRlcm4gPSBwOwogICAgc2l6ZSA9IHM7Cn0KV29yZDo6V29yZCgpCnsKfQogCiAKV29yZDo6fldvcmQoKQp7CiAgICB3b3JkLmNsZWFyKCk7CiAgICBwYXR0ZXJuLmNsZWFyKCk7Cn0KaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBvc2l0aW9uczsKICAgIHN0ZDo6c3RyaW5nIF93b3JkOwogICAgc3RkOjpzdHJpbmcgX3BhdHRlcm47CiAgICBpbnQgczsKICAgIGludCBuOwogICAgc3RkOjpjaW4gPj4gbjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgewogICAgICAgIHN0ZDo6Y2luID4+IHMgPj4gX3BhdHRlcm4gPj4gX3dvcmQ7CiAgICAgICAgV29yZCBwMShfd29yZCwgX3BhdHRlcm4sIHMpOwogICAgICAgIHBvc2l0aW9ucyA9IHAxLmxvb2tGb3JQYXR0ZXJucygpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLnNpemUoKTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHBvc2l0aW9uc1tpXSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQoJCXBvc2l0aW9ucy5jbGVhcigpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=