牛牛和字符串的日常 [kmp]

牛牛和字符串的日常

https://ac.nowcoder.com/acm/contest/7412/G

题意

给出一个模板串和n个字符串,设每个字符串的权值为其字串中模板串前缀的长度,求n个字符串中最大权值和。

题解

前置知识:kmp
使用kmp的next数组即可,在两串匹配过程中不断更新j指针能在模板串中到达的最远位置,即为能匹配的最长前缀。将n个字符串逐个匹配取最大值加和即可。

code

#include <bits/stdc++.h>
#define reg register
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define e exp(1.0)
#define ios ios::sync_with_stdio(false)
#define rep(i,l,r) for(int i=(l);i<(r);i++)
using namespace std;

const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;

int nxt[maxn];
void getnxt(string p)
{
   nxt[0] = -1;
   int i = 0, j = -1;
   while(i < p.size()){
      if(j == -1 || p[i] == p[j]){
         j++;
         i++;
         nxt[i] = j;
      }
      else j = nxt[j];
   }
}

int kmp(string a, string p)
{
   int mx = 0;
   getnxt(p);
   int i = 0,j = 0;
   while(i < (int)a.size() && j < (int)p.size()){
      if(j == -1 || a[i] == p[j]){
         i++;
         j++;
         mx = max(mx,j);
      }
      else j = nxt[j];

   }
   return mx;
}

int main()
{
   string s;
   cin>>s;
   getnxt(s);
   int n;
   cin>>n;
   ll res = 0;
   for(int i = 0; i < n;++i){
      string p;
      cin>>p;
      res += 1ll * kmp(p,s);
   }
   cout<<res<<endl;


   return 0;
}
全部评论

相关推荐

12-24 20:49
武汉大学 Java
点赞 评论 收藏
分享
11-28 16:00
已编辑
武汉理工大学 Java
想干测开的tomca...:这份简历是“短期项目硬堆中大型系统技术”的“技术炫技式造假模板”,槽点密集到能当反面教材: ### 1. 「项目时长」和「技术密度」严重脱节,造假痕迹焊死在简历上 两个项目时长分别是**3个月、2个月**,但堆了Spring AI、Elasticsearch、MinIO、Kafka、ShardingSphere、Docker、Sentinel等近20个中大型项目才用的技术——正常情况下,光把这些中间件的文档看完+环境搭好,3个月都不够,更别说实现“AI多轮对话、分库分表、RBAC权限、大模型调用”这些功能。 说白了:你这不是“做项目”,是把“后端技术栈清单”往项目里硬塞,明摆着“只调用了API,没碰过核心逻辑”。
点赞 评论 收藏
分享
黑着眼圈看手机:pdd秋招笔试挂了,春招还行吗
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务