首页 > 其他分享 >拓展kmp的应用

拓展kmp的应用

时间:2023-09-07 23:22:46浏览次数:52  
标签:1000100 int len Next step 拓展 应用 kmp

Smiling & Weeping

                ---- 我与月亮,进行了一次深夜谈话

                  它与我谈论太阳,而我与它谈论你。

 

题目链接:P3435 [POI2006] OKR-Periods of Words - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:其实也就是kmp拓展,求s与s的每个后缀的LCP(最长公共前缀),但是这样超时,需要一个小小的优化(记录跳转即step[k],跳到可以上一个可以实现的地方,尽量保持复杂度在线性),同时s[i] == s[0]时,直接使ans += i;

Talk is cheap , show me the code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n , Next[1000100] , step[1000100];
 4 char str[1000100];
 5 void getNext(char *c){
 6     int len = strlen(c);
 7     int p = 0 , k = 1 , l;
 8     Next[0] = len;
 9     while(p+1 < len && c[p] == c[p+1]) p++;
10     Next[1] = p;
11     for(int i = 2; i < len; i++){
12         p = k+Next[k]-1;
13         l = Next[i-k];
14         if(i+l <= p) Next[i] = l;
15         else{
16             int j = max(0 , p-i+1);
17             while(i+j < len && c[i+j] == c[j]) j++;
18             Next[i] = j;
19             k = i;
20         }
21     } 
22 }
23 int main()
24 {
25     long long ans = 0;
26     int q=0 , k;                      // q代表周期,k代表最远到达的距离
27     scanf("%d",&n); scanf("%s",str);
28     getNext(str);
29     for(int i = 1; i < n; i++){
30         if(str[i] == str[0]){
31             ans += i;
32         } else {
33             int r = i-1 , tem = r;
34             while(Next[r] < i-r+1 && r >= (i+1)/2){
35                 if(step[r] && step[r] < r) // 警惕bug,可能有step[r]==r,陷入死循环
36                     r = step[r];
37                 else r--;
38             }
39             if(r >= (i+1)/2 && Next[r] >= i-r+1) ans += r;
40             step[tem] = r;
41         }
42     }
43     printf("%lld\n",ans);
44     return 0;
45 }

一棵树,一块岩石,一朵云

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

标签:1000100,int,len,Next,step,拓展,应用,kmp
From: https://www.cnblogs.com/smiling-weeping-zhr/p/17686351.html

相关文章

  • Lua02——应用场景及环境安装
    应用场景是当今游戏领域使用最广泛的脚本语言之一。搭配OpenResty使用,可以扩展Nginx服务器的功能,使用者仅需要编写Lua代码就能轻松完成业务逻辑。与Redis结合。AdobePhotoshopLightroom搭配Lua编写插件。与游戏结合:C/C++语言实现的服务器引擎内核,其中包括最核心的功能,比......
  • CDN的原理与应用场景
    CDN(ContentDeliveryNetwork,内容分发网络)是一种广泛使用的互联网技术,它的主要作用是在网络中建立一个高效、稳定、快速的内容分发系统,使得用户能够更快地获取所需内容。CDN的原理是基于分布式的服务器网络,这些服务器分布在全世界的各个地方,被称为CDN节点。当用户访问一个使用了CDN......
  • KMP
    KMP1.作用用于字符串匹配,在文本串$S$中查找模式串$P$。(较短的或许直接调用函数?)2.过程(结合画图分析)KMP算法相较于朴素算法的精髓在个人看来在于不回退指针$i$,以及$Next[i]$(模式串在位置$i$以前的子串的最长公共前后缀)。为什么不用回退$i$?在$i$(匹配失败的位置)之......
  • KMP算法详解
    呼——终于看懂了KMP——磕了三天了。题目直达Q:KMP是干什么的?是查找字符串用的,可以查找到\(S2\)字符串在\(S1\)字符串中出现的位置(当然,你可以统计出次数)。Q:那复杂度是多少的?通常,我们认为他的复杂度是\(O(|S1|)\),虽然有点常数。常规的的比较方法是直接比较,枚......
  • 使用Visual Studio实现.NET的应用程序设计
    1、首先当然是下载好VisualStudio软件啦!(2019版本)2、新建一个名为StuMis的解决方案3、在解决方案里面新建一个名为MK01的类库和一个名为MK02的类库右键解决方案,选择新建项目,选择类库:4、此时,其实StuMis并未引用到这两个类库我们需要为StuMis引用到这两个类库:右键引用,添......
  • 华为云区块链荣获2023信任科技卓越应用奖
    6月29日,由长沙市人民政府、中国信息通信研究院、中国通信标准化协会主办的“TrustWeb3.0信任科技大会”在长沙市经济开发区隆重召开。会上颁发了30个信任科技优秀案例奖项,其中,华为云区块链凭借“区块链+全民健康信息平台赋能商保理赔案例”获得了此次信任科技案例的“信任科技卓越......
  • Socks5代理IP在网络安全与跨境电商中的应用
    随着全球化的不断推进,跨境电商和在线游戏行业在全球范围内迅速发展。然而,这些领域也面临着日益严峻的网络安全挑战。为了保护数据和确保无缝的国际互联网连接,网络工程师们一直在寻找创新的解决方案。其中,Socks5代理IP技术在这一领域中崭露头角,成为网络安全和跨境电商的强大工具。So......
  • Socks5代理IP在网络安全与跨境电商中的应用
    随着全球化的不断推进,跨境电商和在线游戏行业在全球范围内迅速发展。然而,这些领域也面临着日益严峻的网络安全挑战。为了保护数据和确保无缝的国际互联网连接,网络工程师们一直在寻找创新的解决方案。其中,Socks5代理IP技术在这一领域中崭露头角,成为网络安全和跨境电商的强大工具。So......
  • 区域LIS应用平台 云技术的SaaS模式
    在医疗机构内部,院内实验室主要负责本院临床科室的检验,院内LIS系统必须满足实验室日常的标本处理入库、仪器联机、检验结果处理、报告打印、报告发布、检验信息统计、检验信息报告发布、标本流程、外部医疗机构检验报告调阅等工作。 在医疗机构间,一方面在区域卫生信息平台上构建区......
  • 激光测风雷达的原理及应用介绍
    激光测风雷达是一款小型、全自动、无环境电磁干扰的风廓线型相干多普勒激光雷达,采用多普勒外差法,根据空气中颗粒物的激光后向散射回波的多普勒频移测量风速和风向等参数,具有探测盲区小、精度高、体积小、重量轻等特点,主要应用于气象气候监测、天气探测、空气污染追踪、大气研究和风......