分析
考虑每个串和模板串可以匹配的最大前缀,就应该是两个串在匹配过程中的最长匹配长度,这就是 的
数组可以做的事。直接
就好了,时间复杂度为
。
代码
#include<bits/stdc++.h>
using namespace std;
int read() {
int x = 0,f = 0;char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = 1;ch = getchar();}
while(isdigit(ch)) {x = x*10 + ch - '0';ch = getchar();}
return f?-x:x;
}
const int N = 1e5+100;
char ch[N],s[N];
int ans,nxt[N],n,m;
signed main() {
scanf("%s",ch+1); n = strlen(ch + 1);
for(int i = 2,j = 0;i <= n;i++) {
while(j && ch[j+1] != ch[i]) j = nxt[j];
if(ch[j+1] == ch[i]) j++;
nxt[i] = j;
}
m = read();
while(m--) {
scanf("%s",s+1);int len = strlen(s+1);
int res = 0;
for(int i = 1,j = 0;i <= len;i++) {
if(j && ch[j+1] != s[i]) j = nxt[j];
if(ch[j+1] == s[i]) j++;
res = max(res,j);
if(j == n) j = nxt[j];
}
ans += res;
}
cout << ans << endl;
return 0;
return 0;
}
京公网安备 11010502036488号