题目描述
牛牛每天都要做的事就是读书,从书里找自己喜欢的句子,他每天都会去读一本书,如果牛牛今天读的书的某连续kk个字符刚好是牛牛喜欢句子的某个前缀,那么牛牛将得到kk点兴奋感,但他每天只能注意到一次自己喜欢的句子(也就是每天只能增加一次兴奋感),也就是说他会尽量去找那个让自己兴奋度增加最多的句子,那么,nn天之后牛牛总共最多能有多少兴奋感?
输入描述:
第一行是一个字符串s(∣s∣<=1×105)表示牛牛喜欢的字符串第一行是一个字符串s(∣s∣<=1×105)表示牛牛喜欢的字符串
第二行是一个整数n,表示总共经历了n天(n<=100)第二行是一个整数n,表示总共经历了n天(n<=100)
接下来n行每行一个字符串ti(∣ti∣<=1×105),分别表示牛牛第i天读的书接下来n行每行一个字符串ti(∣ti∣<=1×105),分别表示牛牛第i天读的书
输出描述:
输出这n天来牛牛最大能获得的兴奋感
示例1
输入
abcdefg 3 adcabc xyz abdefg
输出
5
说明
第一天有"a","abc"可以增加兴奋度,选择"abc",第二天没有,第三天有"ab",总共为5
const int N = 100010, M = 200010;
const int mod = 1e9 + 7;
char p[N], s[N];
int ne[N], n;
void next_(){
for (int i = 2, j = 0; i <= n; i ++){
while(j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j ++;
ne[i] = j;
}
}
int main(){
scanf("%s", p + 1);
n = strlen(p + 1);
next_();
int t;
scanf("%d",&t);
int res = 0;
for (int l = 1; l <= t; l ++){
scanf("%s",s + 1);
int mx = 0;
int m = strlen(s + 1);
for (int i = 1, j = 0; i <= m; i ++){
while(j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j ++;
mx = max(mx,j);
if (j == m){
break;
}
}
res += mx;
}
printf("%d\n",res);
return 0;
}