#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn=1e6+5;
int next1[maxn];
int extend[maxn];
char S[maxn];/* 求解 T 中 next[],注释参考 GetExtend() */voidGetNext(char T[], int & m, int next1[]){
int a =0, p =0;
next1[0]= m;for(int i =1; i < m; i++){if(i >= p || i + next1[i - a]>= p){if(i >= p)
p = i;while(p < m &&T[p]==T[p - i])
p++;
next1[i]= p - i;
a = i;}else
next1[i]= next1[i - a];}}/* 求解 extend[] */voidGetExtend(char S[], char T[], int extend[], int next1[]){
int a =0, p =0;
int n=strlen(S);
int m=strlen(T);GetNext(T, m, next1);for(int i =0; i < n; i++){if(i >= p || i + next1[i - a]>= p)// i >= p 的作用:举个典型例子,S 和 T 无一字符相同{if(i >= p)
p = i;while(p < n && p - i < m &&S[p]==T[p - i])
p++;
extend[i]= p - i;
a = i;}else
extend[i]= next1[i - a];}}
int main(){return0;}
2.
#include <iostream>
#include <string>
using namespace std;/* 求解 T 中 next[],注释参考 GetExtend() */voidGetNext(string &T, int & m, int next[]){
int a =0, p =0;
next[0]= m;for(int i =1; i < m; i++){if(i >= p || i + next[i - a]>= p){if(i >= p)
p = i;while(p < m &&T[p]==T[p - i])
p++;
next[i]= p - i;
a = i;}else
next[i]= next[i - a];}}/* 求解 extend[] */voidGetExtend(string &S, int & n, string &T, int & m, int extend[], int next[]){
int a =0, p =0;GetNext(T, m, next);for(int i =0; i < n; i++){if(i >= p || i + next[i - a]>= p)// i >= p 的作用:举个典型例子,S 和 T 无一字符相同{if(i >= p)
p = i;while(p < n && p - i < m &&S[p]==T[p - i])
p++;
extend[i]= p - i;
a = i;}else
extend[i]= next[i - a];}}
int main(){
int next[100];
int extend[100];
string S,T;
int n, m;while(cin >>S>>T){
n =S.size();
m =T.size();GetExtend(S, n,T, m, extend, next);// 打印 next
cout <<"next: ";for(int i =0; i < m; i++)
cout << next[i]<<" ";// 打印 extend
cout <<"\nextend: ";for(int i =0; i < n; i++)
cout << extend[i]<<" ";
cout << endl << endl;}return0;}