reference:http://algs4.cs.princeton.edu/53substring/
构建有限状态自动机,dfa[i][j]:当模式串中j位置元素和主串元素i匹配时,下一次j的位置
// 数组指针(行指针,指向数组的指针) int (*a)[4] 指向长度为4的一维数组的指针,指针指向的元素为长度为4的一维数组
//使用数组指针可以传递二维数组,动态申请二维数组(可以不知第一维,但需要确定第二维)
//eg int a[3][4]可以写为 int (*a)[4] 第二维的长度指定
//指针数组(数组,每个元素都是一个指针) int* p[10]
// Demo: 传入传出二维数组
// int(*fun(int b[][100]))[100]{
// return b;
// }
//reference:http://www.cnblogs.com/mq0036/p/3382732.html
//for more info:http://blog.youkuaiyun.com/code_crash/article/details/4854965
#include<iostream>
#include<string>
using namespace std;
#define R 26 //alphabet table size
int (*get_dfa(string pat))[100] {
int dfa[R][100] = { 0 };
int M = pat.length(), x = 0;
dfa[(unsigned int)pat.at(0)-97][0] = 1;
for (int i = 1; i < M; i++) {
for (int j = 0; j < R; j++) {
dfa[j][i] = dfa[j][x];
}
dfa[(unsigned int)pat.at(i)-97][i] = i + 1;
x = dfa[(unsigned int)pat.at(i)-97][x];
}
return dfa;
}
int KMP(string x, string pat) {
int (*dfa)[100] = get_dfa(pat);
int i = 0, j = 0, N = x.length(), M = pat.length();
for (i = 0; i <N&&j<M; i++) {
j = dfa[(unsigned int)x.at(i)-97][j];
}
if (j == M) return i - M;
else return N;
}
int main() {
string s, pat;
cin >> s >> pat;
cout << KMP(s, pat) << endl;
return 0;
}