思路:KMP裸题
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+7; 4 char p[N],s[N];//p是模式串(短),s是文本串(长) 5 int ne[N];//next[j]就是待匹配串从t[0]开始到t[j-1]结尾的这个子串中,前缀和后缀相等时对应前缀/后缀的最大长度 6 int main() 7 { 8 cin >>s+1; 9 int t;cin >>t; 10 int ans=0; 11 int n=strlen(s+1); 12 for(int i=2,j=0;i<=n;i++)//先求模式串本身的next数组 13 { 14 while(j&&s[i]!=s[j+1]) j=ne[j]; 15 if(s[i]==s[j+1]) j++; 16 ne[i]=j; 17 } 18 //for(int i=1;i<=n;i++) cout <<ne[i]; 19 while(t--){ 20 cin >>p+1; 21 int m=strlen(p+1); 22 int cnt=0; 23 for(int i=1,j=0;i<=m;i++){ 24 while(j&&p[i]!=s[j+1]) j=ne[j]; 25 if(p[i]==s[j+1]) j++; 26 cnt=max(cnt,j); 27 if(j==n) j=ne[j]; 28 } 29 ans+=cnt; 30 } 31 cout <<ans<<endl; 32 }