首页 > 其他分享 >拓展kmp

拓展kmp

时间:2023-09-07 12:44:33浏览次数:29  
标签:拓展 long Next int len kmp 20001000

Smiling & Weeping

                ---- 我从不觉得暗恋是苦涩的,

                  对一个人的喜欢藏在眼睛里,

                      透过它,

                   世界都变得更好看了。

题目:P5410 【模板】扩展 KMP(Z 函数) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

简介:拓展kmp是这样的一个问题:给定一个长度为n的字符串S,一个长度为m的模式串,求P和S的每个后缀的最长公共前缀

推荐思路理解:P5410 【模板】扩展 KMP(Z 函数) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Talk is cheap , show me the code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 // 开long long
 4 typedef long long ll;
 5 char s[20001000] , t[20001000];
 6 ll Next[20001000] , ext[20001000];
 7 void getNext(char *c){
 8     int len = strlen(c);
 9     int p=0 , k=1 , l;
10     Next[0] = len;                  // 完全重合 
11     while(p+1 < len && c[p] == c[p+1]) p++;
12     Next[1] = p;
13     for(int i = 2; i < len; i++){
14         p = k+Next[k]-1;            // 前缀最远能到达的距离
15         l = Next[i-k];              // 在i-k开始的LCP
16         if(i+l <= p) Next[i] = l;   // 没有超过最长的前缀到达距离
17         else{                       // 超过了
18             int j = max(0 , p-i+1);
19             while(i+j < len && c[i+j] == c[j]) j++;
20             k = i;
21             Next[i] = j;
22         }
23     }
24 }
25 void extkmp(char *a , char *b){
26     int la = strlen(a) , lb = strlen(b);
27     int p=0 , k=0 , l;
28     while(p < la && p < lb && a[p] == b[p]) p++;
29     ext[0] = p;
30     for(int i = 1; i < la; i++){
31         p = k+ext[k]-1;
32         l = Next[i-k];
33         if(i+l <= p) ext[i] = l;
34         else{
35             int j = max(0 , p-i+1);
36             while(i+j < la && j < lb && a[i+j] == b[j]) j++;
37             ext[i] = j;
38             k = i;
39         }
40     }
41 }
42 int main()
43 {
44     scanf("%s",s); scanf("%s",t);
45     getNext(t);
46     extkmp(s,t);
47     ll ans=0;
48     for(int i = 0; i < strlen(t); i++)
49         ans ^= (i+1)*(Next[i]+1);
50     printf("%lld\n",ans);
51     ans = 0;
52     for(int i = 0; i < strlen(s); i++)
53         ans ^= (i+1)*(ext[i]+1);
54     printf("%lld\n",ans);
55     return 0;
56 }

文章到此结束,我们下次再见

标签:拓展,long,Next,int,len,kmp,20001000
From: https://www.cnblogs.com/smiling-weeping-zhr/p/17684531.html

相关文章

  • kmp模板
    Smiling&Weeping----深情是我担不起的重任,情话只是偶然兑现的谎言 题目:Problem-2087(hdu.edu.cn)就是简单的kmp,再加上一个判断是否和上一个重复现在上模板:Talkischeap,showmethecode1#include<iostream>2#include<cstr......
  • KMP算法--解决字符串匹配问题--模式串是否在文本串出现过
    KMP算法--解决字符串匹配问题--模式串是否在文本串出现过*利用之前判断过的信息,通过next数组保存最长公共子序列的长度*搜索词/模式串移动的位数=已匹配的字符数-对应的部分匹配值在韩的例子里ABCDABD初次匹配匹配了ABCDAB6位,对应2,所以移动6-2=4位e.g.文本串aabaabaaf......
  • 串的匹配算法:Brute-Force 与 KMP
    目录串的匹配算法:Brute-Force与KMPBrute-Force(布鲁特-福斯)算法KMP算法参考文献串的匹配算法:Brute-Force与KMP串的匹配算法是求子串在主串位置的算法。本次介绍的算法是在指定了从主串特定位置后寻找第一个匹配字串的位置。在介绍算法前,先定义几个变量:主串S、字串T、要求......
  • 拓展边界:探索无人驾驶技术中的感知与决策
    无人驾驶技术正以惊人的速度改变着我们的交通方式和城市生活。在实现自动驾驶的过程中,感知与决策是关键的两个环节,涉及到车辆对周围环境的理解和智能决策。本文将深入探讨无人驾驶技术中感知与决策的重要性,以及它们在现实场景中的应用。感知:车辆的“眼睛”和“耳朵”感知是自动驾驶......
  • 算法学习-exKMP
    什么是exKMPexKMP(Z-Algorithm)是一个可以在\(O(|S|+|T|)\)的时间复杂度内求出\(T\)串的每个后缀与\(T\)的LCP(最长公共前缀)\(T\)串和\(S\)串每个后缀的LCP。的算法。算法过程首先回忆一下KMP算法,求\(nxt\)数组和两串匹配本质上没啥区别。所以我们尝试也将......
  • 在线学习平台开发需要多少钱,以及如何进行定制化的功能拓展
    近期,一位教育领域的创业者找到我们,他有一个抱负:构建一套完整的在线学习体系,覆盖付费课程、在线学习以及考试等多个功能。当然,如何实现这样一个宏伟目标也是需要投入不小的费用的。那么,我们来探讨一下,打造这样一个在线学习平台需要多少成本,以及如何进行定制化的功能拓展。 解锁......
  • 「学习笔记」扩展 KMP(Z 函数)
    对于个长度为\(n\)的字符串\(s\)。定义\(z[i]\)表示\(s\)和\(s[i,n-1]\)(即以\(s[i]\)开头的后缀)的最长公共前缀(LCP)的长度。\(z\)被称为\(s\)的Z函数。这里注意,在Z函数中,\(z[0]=0\),但是根据LCP的定义,\(z[0]=n\),具体应该为何值,根据题目意思来判断。本文更偏......
  • KMP 字符串匹配 学习笔记
    前言最近才发现自己写了后缀数组,但并没有其他的字符串算法,今天先把\(KMP\)字符串匹配先讲一下。算法核心对于字符串匹配,最朴素的方法就是一个字符一个字符地匹配,找到不同的就直接换一个地方匹配。我们先来看一组样例:\(ababababe\)\(ababe\)对于这组样例,暴力的方法就是直......
  • 洛谷P5410 【模板】扩展 KMP(Z 函数)题解
    题目链接P5410【模板】扩展KMP(Z函数)-洛谷|计算机科学教育新生态(luogu.com.cn) 分析先考虑z数组设nx[i]为字符串b与b以b[i]开头的后缀最长公共前缀设i为当前需要求的位置当前i+nx[i]-1的最大值所对应的i为q p为i对应的位置当i大于q+nx[q......
  • [oeasy]python0085_[趣味拓展]字体样式_下划线_中划线_闪动效果_反相_取消效果
    字体样式回忆上次内容\033xm可以改变字体样式0m-10m之间设置的都是字体效果0m复原1m变亮2m变暗从3m到10m又是什么效果呢??真的可以让文字blink闪烁吗?......