标签:牛牛 ++ len ne int 日常 str 字符串
链接:https://ac.nowcoder.com/acm/contest/11334/G
来源:牛客网
题目描述
牛牛每天都要做的事就是读书,从书里找自己喜欢的句子,他每天都会去读一本书,如果牛牛今天读的书的某连续{}kk个字符刚好是牛牛喜欢句子的某个前缀,那么牛牛将得到{}kk点兴奋感,但他每天只能注意到一次自己喜欢的句子(也就是每天只能增加一次兴奋感),也就是说他会尽量去找那个让自己兴奋度增加最多的句子,那么,{}nn天之后牛牛总共最多能有多少兴奋感?
输入描述:
第一行是一个字符串s(|s|<=1×10^5)表示牛牛喜欢的字符串第一行是一个字符串s(∣s∣<=1×10
5
)表示牛牛喜欢的字符串
第二行是一个整数n,表示总共经历了n天(n<=100){}第二行是一个整数n,表示总共经历了n天(n<=100)
接下来n行每行一个字符串t_i(|t_i|<=1×10^5),分别表示牛牛第i天读的书接下来n行每行一个字符串t
i
(∣t
i
∣<=1×10
5
),分别表示牛牛第i天读的书
输出描述:
输出这n天来牛牛最大能获得的兴奋感
示例1
输入
复制
abcdefg
3
adcabc
xyz
abdefg
输出
复制
5
说明
第一天有"a",“abc"可以增加兴奋度,选择"abc”,第二天没有,第三天有"ab",总共为5
看每个字符串最多能匹配到模式串的哪里
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int ne[N];
int main(){
char str[N];
cin >> str + 1;
int len = 1;
while(str[len]) len ++;
for (int i = 2, j = 0; i < len; i ++){
while(j && str[i] != str[j + 1]) j = ne[j];
if (str[i] == str[j + 1]) ne[i] = j;
j = ne[j];
}
int n;
long long ans = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i ++){
int cnt = 0;
char s[N];
cin >> s + 1;
int len = 1;
while(s[len]) len ++;
for (int i = 1, j = 0; i < len; i ++){
while(j && s[i] != str[j + 1]) j = ne[j];
if (s[i] == str[j + 1]) j ++;
cnt = max(cnt, j);
}
ans += cnt;
}
cout << ans << endl;
}
标签:牛牛,++,len,ne,int,日常,str,字符串 来源: https://blog.csdn.net/qq_45772483/article/details/112557985
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。