解法:对主串求next数组,在分别和n个串匹配,每次求最大前缀长度相加即可,(kmp算法)
#include<bits/stdc++.h> using namespace std; int nt[100005]; void getnt(string s) { int len=s.size(); int i=0,j=-1; nt[0]=-1; while(i<len) { while(j!=-1&&s[i]!=s[j]) j=nt[j]; nt[++i]=++j; } for(int i=0;i<=len;i++) { printf("nt[%d]=%d\n",i,nt[i]); } } int kmp(string s,string t) { int i=0,j=0; int mx=0; while(j<t.size()) { if(i==-1||s[i]==t[j]) { i++; j++; mx=max(mx,i); } else i=nt[i]; } // printf("%d\n",mx); return mx; } int main() { string s; cin>>s; getnt(s); int n; cin>>n; int ans=0; for(int i=0;i<n;i++) { string t; cin>>t; ans+=kmp(s,t); } cout<<ans<<endl; }
牛牛和字符串的日常 kmp
最新推荐文章于 2021-10-18 21:14:28 发布