import java.util.Scanner;
class KMPAlgorithm {
public static int[] setupKMP
(String pattern
) {
int a[] = new int[pattern.length()];
a[0]=0;
int j=1;
for(int i=2;i<pattern.length();)
{
if(pattern.charAt(j)==pattern.charAt(i))
{
j++;
a[i]=j;
i++;
}
else if(j>0)
{
j = a[j];
}
else
{
a[i]=0;
i++;
}
}
return a;
}
/**
* @param args
*/
public static void main
(String[] args
) { // TODO Auto-generated method stub
Scanner in
= new Scanner
(System.
in); String pattern
= in.
nextLine(); int a[] = setupKMP(pattern);
int j=0;
for(int i=0;i<text.length();)
{
if(pattern.charAt(j)==text.charAt(i))
{
j++;
i++;
}
else
{
if(j>0)
{
j = a[j-1];
}
else
{
i++;
}
}
if(j==pattern.length())
{
System.
out.
println("pattern found at " + (i
-pattern.
length()+1)); }
}
}
}
aW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwoKCmNsYXNzIEtNUEFsZ29yaXRobSB7CgoJCglwdWJsaWMgc3RhdGljIGludFtdIHNldHVwS01QKFN0cmluZyBwYXR0ZXJuKQoJewoJCWludCBhW10gPSBuZXcgaW50W3BhdHRlcm4ubGVuZ3RoKCldOwoJCWFbMF09MDsKCQlpbnQgaj0xOwoJCWZvcihpbnQgaT0yO2k8cGF0dGVybi5sZW5ndGgoKTspCgkJewoJCQlpZihwYXR0ZXJuLmNoYXJBdChqKT09cGF0dGVybi5jaGFyQXQoaSkpCgkJCXsKCQkJCWorKzsKCQkJCWFbaV09ajsKCQkJCWkrKzsKCQkJfQoJCQllbHNlIGlmKGo+MCkKCQkJewoJCQkJaiA9IGFbal07CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlhW2ldPTA7CgkJCQlpKys7CgkJCX0KCQl9CgkJcmV0dXJuIGE7Cgl9CgkvKioKCSAqIEBwYXJhbSBhcmdzCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCgkJU2Nhbm5lciBpbiA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CgkJU3RyaW5nIHRleHQgPSBpbi5uZXh0TGluZSgpOwoJCVN0cmluZyBwYXR0ZXJuID0gaW4ubmV4dExpbmUoKTsKCQlpbnQgYVtdID0gc2V0dXBLTVAocGF0dGVybik7CgkJaW50IGo9MDsKCQlmb3IoaW50IGk9MDtpPHRleHQubGVuZ3RoKCk7KQoJCXsKCQkJaWYocGF0dGVybi5jaGFyQXQoaik9PXRleHQuY2hhckF0KGkpKQoJCQl7CgkJCQlqKys7CgkJCQlpKys7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZihqPjApCgkJCQl7CgkJCQkJaiA9IGFbai0xXTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpKys7CgkJCQl9CgkJCX0KCQkJaWYoaj09cGF0dGVybi5sZW5ndGgoKSkKCQkJewoJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXR0ZXJuIGZvdW5kIGF0ICIgKyAoaS1wYXR0ZXJuLmxlbmd0aCgpKzEpKTsKCQkJfQoJCX0KCX0KCn0K