首页 > 其他分享 >洛谷P5410 【模板】扩展 KMP(Z 函数)题解

洛谷P5410 【模板】扩展 KMP(Z 函数)题解

时间:2023-08-19 15:12:09浏览次数:126  
标签:洛谷 int 题解 扩展 long nx P5410 数组 ex

题目链接

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]-1时

暴力扩展即可

当 i 小于 q+nx[q]-1 时

如图

那么 p~nx[q] 与 i~q+nx[q]-1 是相同的

q+nx[q]与 nx[q]+1 (即 q 扩展的下一个位置)是不同的

当 p+nx[p]-1 小于 nx[q] 时

如图

nx[i]=nx[p]

当 p+nx[p]-1 大于 nx[q] 时

如图

nx[i]=q+nx[q]-i

当 p+nx[p] 等于 nx[q] 时

nx[i] 大于或等于 q+nx[q]-i

令其等于 q+nx[q]-i 再暴力扩展即可

 

再考虑 p 数组

我们发现与 z 数组求法相同

只是 p 从原字符串变到另一字符串而已

 

细节

22pts:需要开 long long

93pts:求 p 数组扩展时 ex[i]+1 不能超过 b 数组长度

 

代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define int long long//细节1 
 5 
 6 const int N=20000007;
 7 
 8 char a[N],b[N];
 9 
10 int nx[N],ex[N];
11 
12 signed main(){
13     scanf("%s %s", a+1, b+1);
14     int la=strlen(a+1),lb=strlen(b+1);
15     nx[1]=lb;
16     int ans=lb+1;
17     for(int i=2,q=0;i<=lb;i++){//z数组 
18         if(i<=q+nx[q]-1){
19             int p=i-q+1;
20             if(p+nx[p]-1<nx[q]) nx[i]=nx[p];
21             else nx[i]=q+nx[q]-i;//小于和等于赋值相同 
22         }
23         while(b[nx[i]+1]==b[i+nx[i]]) nx[i]++;//暴力扩展 
24         if(i+nx[i]-1>q+nx[q]-1) q=i;//更新q 
25         ans^=i*(nx[i]+1);//计算答案 
26     }
27     cout<<ans<<endl;
28     
29     ans=0;
30     for(int i=1,q=0;i<=la;i++){//p数组 
31         if(i<=q+ex[q]-1){
32             int p=i-q+1;
33             if(p+nx[p]-1<ex[q]) ex[i]=nx[p];
34             else ex[i]=q+ex[q]-i;
35         }
36         while(b[ex[i]+1]==a[i+ex[i]]&&ex[i]+1<=lb) ex[i]++;//细节2 
37         if(i+ex[i]-1>q+ex[q]-1) q=i;
38         ans^=i*(ex[i]+1);
39     }
40     cout<<ans<<endl;
41     return 0;
42 }

 

标签:洛谷,int,题解,扩展,long,nx,P5410,数组,ex
From: https://www.cnblogs.com/Idtwtei/p/17642481.html

相关文章

  • arc139,arc140,arc141题解
    ARC139A-DATrailingZeros憨的。BMakeN感觉没有那么naive。首先用\(1\)去更新一下后面两个决策的价值。然后有一个较为显然的东西是说\(\text{lcm}\)为周期,周期内应该贪心取最大的。周期外由于范围很小,可以直接枚举一种决策的次数,取最小值即可。复杂度是正确的。CO......
  • Luogu P9510 『STA - R3』高维立方体 题解
    题目传送门没见过这玩意,写个题解记下。题目大意周知斐波那契数列定义为:\[\operatorname{fib}(n)=\left\{\begin{aligned}1&&n\le2\\\operatorname{fib}(n-1)+\operatorname{fib}(n-2)&&n>2\end{aligned}\right.\]然后定义(\(n\le0\)函数值为\(0\))\[f(n)......
  • CF-1860C Game on Permutation题解
    题意:在一条数轴上,Alice可以跳到在你所在点前面且值比当前所在点小的点。每回合可以向任意符合要求的点跳一次。当轮到Alice的回合同时不存在符合要求的点,Alice就赢了。Alice可以选择一个点作为起始点,然后作为后手(赛时这里把我坑了)。问有多少个点是必胜的点。\(n\leq3\times10^5......
  • P6429 [COCI2008-2009#1] JEZ 题解
    题目传送门:Click。某蒟蒻看见这道题,想了足足一个晚上,过后茅塞顿开,故作此篇。感谢神犇的题解。看题目数据范围:\(1\leqr,c\leq10^6,1\leqk\leq10^{12}\),显然打暴力\(\mathcal{O}(rc)\)的时间复杂度是行不通的。必须做到近似于\(mathcal{O}(r)\)的时间复杂度。观察题......
  • [AGC004F] Namori 题解
    这里给出一种与其他题解完全不同的实现方式。思路发现图要么是一棵树,要么是一颗基环树。树我们首先考虑树如何操作。我们可以\(\text{dfs}\)这颗树。对于每个点维护一个\(w,h\),表示这个点想要变成白色\(w\)次,想要变成黑色\(h\)次。容易发现每个点最初状态都为\(w=0......
  • Mike and strings 题解
    题目传送门一道字符串题。由于\(n\)非常小,可以暴力枚举字符串。我们可以枚举其中一个字符串\(s_i\),然后让其他的字符串变成\(s_i\),最后记录一下次数,取一个最小值即可。在枚举第二个字符串的时候可以将它再复制一份自己到后面,然后可以用find函数来统计。当然,如果找不到,这......
  • 洛谷_[P4084]Barn Painting G题解
    题目链接这题我们可以定义一个二维的dp数组,在dp[i][j]中:i表示对于节点i,j有1,2,3三种状态,表示当点i选择被染成颜色j时,以i为根的这颗子树有多少种染色方法。那么根据乘法原理,节点i的方案数肯定等于i的每个儿子的方案数量之积。这道题整个挺简单的,剩下细节......
  • 2023年 8月15日普及组南外集训题解
    A陷阱我们可以从\(l\)枚举到\(d\),再计算是否满足要求,满足要求加入到数组中,输出第一个和最后一个#include<iostream>usingnamespacestd;constintN=1e5+5;intk;intnums[N];intmain(){intl,d,x;cin>>l>>d>>x;for(inti=l;i<=d......
  • CF1806E 题解
    题目大意给你一棵树,然后定义一个函数$f(x,y)$,接下来给你$q$组询问\(x_{i},y_{i}\),让你求每一次的$f(x_{i},y_{i})$。分析首先我们尝试根据这个函数的定义暴力求值,代码实现如下。llBFquery(intg,inth){if(!g)return0;return1ll*a[g]*a[h]+BFquery(p......
  • P4005题解
    闲来无事写篇题解题面传送门简要题意一条线段上有\(n\)个点成对连接,求所连的线最小交点数。思路看到题目中\(n\le44\)自然想到最终复杂度大约在\(O(2^\frac{n}{2})\)左右。经过思考不难发现不论如何两地铁站之间有且只有以下八种方式进行连接:显然可以暴搜解决,......