- #include <cstdio> 
- #include <cstring> 
- #define BASE 163 
- #define MOD 1000000007 
- using namespace std; 
-   
- char text[600000], pattern[600000]; 
- long long pow[600000], ht[600000], hp[600000], ans[600000]; 
-   
- int main()  
- { 
- 	pow[0] = 1; 
- 	for (int i = 1; i <= 500000; ++i) 
- 		pow[i] = (pow[i-1] * BASE) % MOD;	 
- 	int n; 
- 	while ((scanf ("%lld", &n)) != EOF) 
- 	{ 
- 		memset (pattern, '\0', sizeof(pattern)); 
- 		getchar(); 
- 		scanf ("%s", pattern); 
- 		memset (text, '\0', sizeof(text)); 
- 		getchar(); 
- 		scanf ("%s", text); 
- 		hp[0] = pattern[0];	 
- 		for (int i = 1; i < n; ++i) 
- 		{ 
- 			hp[i] = (hp[i-1] * BASE) % MOD; 
- 			hp[i] += pattern[i]; 
- 			hp[i] %= MOD; 
- 		} 
- 		int m = strlen(text); 
- 		ht[0] = text[0]; 
- 		for (int i = 1; i < m; ++i) 
- 		{ 
- 			ht[i] = (ht[i-1] * BASE) % MOD; 
- 			ht[i] += text[i]; 
- 			ht[i] %= MOD; 
- 		} 
- 		int count = 0; 
- 		memset (ans, 0, sizeof(ans)); 
- 		for (int i = 0; i <= m-n; ++i) 
- 		{ 
- 			if (i == 0) 
- 			{ 
- 				if (hp[n-1] == (ht[i+(n-1)])) 
- 					ans[count++] = i; 
- 			} 
- 			else 
- 			{ 
- 				if (hp[n-1] == (ht[i+(n-1)] - (((ht[i-1] * pow[n])) % MOD))) 
- 					ans[count++] = i;	 
- 			}		 
- 		} 
- 		for (int i = 0; i < count; ++i) 
- 			printf ("%lld\n", ans[i]); 
- 		printf ("\n");	 
- 	}	 
- 	return 0; 
- } 
				I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdHJpbmc+CiNkZWZpbmUgQkFTRSAxNjMKI2RlZmluZSBNT0QgMTAwMDAwMDAwNwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2hhciB0ZXh0WzYwMDAwMF0sIHBhdHRlcm5bNjAwMDAwXTsKbG9uZyBsb25nIHBvd1s2MDAwMDBdLCBodFs2MDAwMDBdLCBocFs2MDAwMDBdLCBhbnNbNjAwMDAwXTsKCmludCBtYWluKCkgCnsKCXBvd1swXSA9IDE7Cglmb3IgKGludCBpID0gMTsgaSA8PSA1MDAwMDA7ICsraSkKCQlwb3dbaV0gPSAocG93W2ktMV0gKiBCQVNFKSAlIE1PRDsJCglpbnQgbjsKCXdoaWxlICgoc2NhbmYgKCIlbGxkIiwgJm4pKSAhPSBFT0YpCgl7CgkJbWVtc2V0IChwYXR0ZXJuLCAnXDAnLCBzaXplb2YocGF0dGVybikpOwoJCWdldGNoYXIoKTsKCQlzY2FuZiAoIiVzIiwgcGF0dGVybik7CgkJbWVtc2V0ICh0ZXh0LCAnXDAnLCBzaXplb2YodGV4dCkpOwoJCWdldGNoYXIoKTsKCQlzY2FuZiAoIiVzIiwgdGV4dCk7CgkJaHBbMF0gPSBwYXR0ZXJuWzBdOwkKCQlmb3IgKGludCBpID0gMTsgaSA8IG47ICsraSkKCQl7CgkJCWhwW2ldID0gKGhwW2ktMV0gKiBCQVNFKSAlIE1PRDsKCQkJaHBbaV0gKz0gcGF0dGVybltpXTsKCQkJaHBbaV0gJT0gTU9EOwoJCX0KCQlpbnQgbSA9IHN0cmxlbih0ZXh0KTsKCQlodFswXSA9IHRleHRbMF07CgkJZm9yIChpbnQgaSA9IDE7IGkgPCBtOyArK2kpCgkJewoJCQlodFtpXSA9IChodFtpLTFdICogQkFTRSkgJSBNT0Q7CgkJCWh0W2ldICs9IHRleHRbaV07CgkJCWh0W2ldICU9IE1PRDsKCQl9CgkJaW50IGNvdW50ID0gMDsKCQltZW1zZXQgKGFucywgMCwgc2l6ZW9mKGFucykpOwoJCWZvciAoaW50IGkgPSAwOyBpIDw9IG0tbjsgKytpKQoJCXsKCQkJaWYgKGkgPT0gMCkKCQkJewoJCQkJaWYgKGhwW24tMV0gPT0gKGh0W2krKG4tMSldKSkKCQkJCQlhbnNbY291bnQrK10gPSBpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYgKGhwW24tMV0gPT0gKGh0W2krKG4tMSldIC0gKCgoaHRbaS0xXSAqIHBvd1tuXSkpICUgTU9EKSkpCgkJCQkJYW5zW2NvdW50KytdID0gaTsJCgkJCX0JCQoJCX0KCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCgkJCXByaW50ZiAoIiVsbGRcbiIsIGFuc1tpXSk7CgkJcHJpbnRmICgiXG4iKTsJCgl9CQoJcmV0dXJuIDA7Cn0=