int nxt[N]; int m, n; string s, t; voidget_next(){ nxt[0] = -1; //默认下标都是从0开始的 int i = 1, j = 0; // 因为nxt[0] 已经初始化成 -1 了 , 所以i从1开始 while(i < m){ if (j == -1 || t[i] == t[j]){ i++, j++; if (t[i] != t[j]) nxt[i] = j; else nxt[i] = nxt[j]; } else j = nxt[j]; } }
intkmp(){ int i = 0, j = 0; n = s.length(); m = t.length(); while(i < n && j < m){ if (j == -1 || s[i] == t[j]) i++, j++; else j = nxt[j]; } if (j >= m) return i - m + 1; // 根据自己的输入输出灵活变通 return-1; }
intmain(){ int T; scanf("%d", &T); while(T--){ cin >> s >> t; get_next(); printf("%d\n", kmp()); } return0; }