https://ac.nowcoder.com/acm/contest/7412/G

#include<iostream>
#include<set>
#include<vector>
#include<cstring>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
typedef long long ll;
using namespace std;
int ne[100005];
string t;
//获得next数组,其中ne[i]表示在长度为i的模式串t中,最大为长度ne[i]的前缀等于后缀
//比如模式串T:abcdab   其中ne[6]=2; 也可以理解为当模式串和给定串在i这个位置不匹配时
//模式串指针返回i=ne[i]的位置 
void get_ne(){
	int i=0,j=-1;
	ne[0]=-1;
//不知道该怎么说   
	while(i<t.length()){ if(t[i]="=t[j]||j==-1){" i++;j++; ne[i]="j;" } else j="ne[j];" for(int i="0;i<=t.length();++i)" cout<<ne[i]<<" "; cout<<endl; kmp 给定串s和模式串t进行匹配 返回的res表示模式串t里面从前往后最多有res个字符在给定串s中连续存在 int kmp(string s){ res="max(res,j);" 对给定串s进行一遍历 ,当和模式串不匹配时,模式串的指针j会进行变化 模式串指针j的最大值就是最大匹配长度 当j="t.length()" 时,表示s中存在t的子串 kmp可以查看模式串是否在给定串中存在,或者存在几位。 while(i<s.length()){ if(s[i]="=t[j]||j==-1){" i++; j++; return res; main() { n,ans="0;" string s; cin>&gt;t&gt;&gt;n;
	get_ne();
	while(n--){
		cin&gt;&gt;s;
		ans+=kmp(s);
	}
	cout&lt;</t.length()){></algorithm></math.h></stdio.h></stdlib.h></cstring></vector></set></iostream>