拓展kmp

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 }

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

posted @ 2023-09-07 12:33  smiling&weeping  阅读(12)  评论(0)    收藏  举报