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