#include
<
iostream
>
using namespace std;
typedef struct String ... {
char* str;
int length;
} ;
void getString(String s) ... {
cin >> s.str;
s.length = strlen(s.str);
}
void getNext(String pattarn, int * next) ... {
int i = 0,
j = -1,
n = pattarn.length;
next[0] = -1;
while( i < n-1 )...{
if( j== -1 || pattarn.str[i] == pattarn.str[j])...{
j++; i++;
next[i] = j;
}else...{
j = next[j];
}
}
}
int subString(String s, String pattarn) ... {
int n = s.length,
m = pattarn.length,
*next = new int[n],
i = 0,
j = 0;
getNext(pattarn, next);
while( i < n && j < m )...{
if( j == -1 || s.str[i] == pattarn.str[j])...{
i++; j++;
}else...{
j = next[j];
}
}
delete next;
if( j == m)
return i - m;
else
return -1;
}
int main() ... {
String s,c;
/**//*getString(s);*/
s.str = "ababcbababac";
s.length = 12;
c.str = "babac";
c.length = 5;
cout <<subString(s,c) << " ";
return 0;
}
using namespace std;
typedef struct String ... {
char* str;
int length;
} ;
void getString(String s) ... {
cin >> s.str;
s.length = strlen(s.str);
}
void getNext(String pattarn, int * next) ... {
int i = 0,
j = -1,
n = pattarn.length;
next[0] = -1;
while( i < n-1 )...{
if( j== -1 || pattarn.str[i] == pattarn.str[j])...{
j++; i++;
next[i] = j;
}else...{
j = next[j];
}
}
}
int subString(String s, String pattarn) ... {
int n = s.length,
m = pattarn.length,
*next = new int[n],
i = 0,
j = 0;
getNext(pattarn, next);
while( i < n && j < m )...{
if( j == -1 || s.str[i] == pattarn.str[j])...{
i++; j++;
}else...{
j = next[j];
}
}
delete next;
if( j == m)
return i - m;
else
return -1;
}
int main() ... {
String s,c;
/**//*getString(s);*/
s.str = "ababcbababac";
s.length = 12;
c.str = "babac";
c.length = 5;
cout <<subString(s,c) << " ";
return 0;
}