#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<cstdio> #include<cmath> #include<stack> #include<cstring> #include<functional> #include<queue> #include<set> #include<map> #define LL long long #define lp(s,i,n) for(int i = s;i < n;i++) #define lpd(s,i,n) for(int i = s;i <= n;i++) #define clr(a,b) memset(a,b,sizeof(a)) #define scn(a) scanf("%I64d",&a) #define prf(a) printf("%d ",a) using namespace std; const int N = 100020; const int MAXE = 20020; const int INF = 0x3f3f3f3f; const double pi = 2 * asin(1); int cnt,pp; int n, m; int a[1000020], b[1000020]; int nex[1000020]; void get_next(string p, int *x) { int i, j; i = 0; j = -1; nex[0] = -1; while (i < p.size()) { if (j == -1 || p[i] == p[j]) { i++; j++; //next[i] = j; if (p[i] != p[j]) nex[i] = j; else nex[i] = nex[j]; //cout << "next[i] = " << j << endl; } else { j = nex[j]; //cout << "i = " << i << " j = " << j << endl; } } } int index_kmp(string p, string x) { int i = -1; int j = -1; int len1 = p.size(); int len2= x.size(); get_next(x, nex); while (i < len1 && j < len2) { if (j == -1 || p[i] == x[j]) { i++; j++; } else { j = nex[j]; //cout << "i = " << i << " j = " << j << endl; } if (j == len2) { cnt++; j =0; } } return cnt; } int main(void) { int t; string a, b; while (cin>>a) { if (a[0] == '#')break; cnt = 0; cin >> b; //cin >> n >> m; //cin >> b >> a; int ans = index_kmp(a, b); cout << ans << endl; } system("pause"); }