1. 程式人生 > >BZOJ3942: [Usaco2015 Feb]Censoring

BZOJ3942: [Usaco2015 Feb]Censoring

col 參考 b+ 一個 長度 i++ target geo turn

【傳送門:BZOJ3942】


簡要題意:

  給出一個母串和一個模式串,當前一個一個地將母串插入到一個字符串中,如果在插入的過程中,當前字符串以模式串為後綴,則將這個模式串從字符串中刪除,然後繼續插入

  求出最後得到的字符串


題解:

  KMP,先求模式串的p數組

  然後直接一個一個地插入母串,實時更新q數組就行了(q[i]表示字符串第i位的後綴與模式串前綴的最大匹配長度)


參考代碼:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include
<algorithm> using namespace std; char A[1100000],B[1100000]; char st[1100000]; int p[1100000],q[1100000]; int main() { scanf("%s%s",A+1,B+1); int len1=strlen(A+1),len2=strlen(B+1); p[1]=0; for(int i=2;i<=len2;i++) { int j=p[i-1]; while(j!=0&&B[j+1]!=B[i]) j=p[j];
if(B[j+1]==B[i]) p[i]=j+1; } int tp=0; for(int i=1;i<=len1;i++) { st[++tp]=A[i]; int j=q[tp-1]; while(j!=0&&B[j+1]!=st[tp]) j=p[j]; if(B[j+1]==st[tp]) q[tp]=j+1; else q[tp]=0; if(q[tp]==len2) for(int k=1;k<=len2;k++) tp--; }
for(int i=1;i<=tp;i++) printf("%c",st[i]); printf("\n"); return 0; }

BZOJ3942: [Usaco2015 Feb]Censoring