生活随笔
收集整理的這篇文章主要介紹了
P4824 [USACO15FEB]Censoring S kmp + 栈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
文章目錄
題意:
思路:
如果刪除之后兩個串不拼起來就是個裸kmpkmpkmp了,但是這個題能拼起來,拼起來之后還有可能生成一個新的串,而且起點在當前位置之前。
考慮是否能找到刪掉之后從哪個位置開始,顯然有點不可做。
考慮到了第iii個位置,刪掉了長度為mmm的串,那么應該到了第i?mi-mi?m的位置,我們不用考慮從哪里開始,可以發現只需要知道i?mi-mi?m的位置匹配到了TTT串的哪個位置,讓后繼續匹配就行了,所以我們開一個數組記錄到了第iii個位置匹配到了哪個位置,讓后再開一個棧用來輸出答案。
復雜度O(n)O(n)O(n)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,m
;
char a
[N
],b
[N
];
int ne
[N
],stk
[N
],top
,pos
[N
];int main()
{
scanf("%s%s",a
+1,b
+1);n
=strlen(a
+1); m
=strlen(b
+1);for(int i
=2,j
=0;i
<=m
;i
++) {while(j
&&b
[i
]!=b
[j
+1]) j
=ne
[j
];if(b
[i
]==b
[j
+1]) j
++;ne
[i
]=j
;}for(int i
=1,j
=0;i
<=n
;i
++) {while(j
&&a
[i
]!=b
[j
+1]) j
=ne
[j
];if(a
[i
]==b
[j
+1]) j
++;stk
[++top
]=i
; pos
[i
]=j
;if(j
==m
) {top
-=m
; j
=pos
[stk
[top
]];}}for(int i
=1;i
<=top
;i
++) printf("%c",a
[stk
[i
]]);return 0;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的P4824 [USACO15FEB]Censoring S kmp + 栈的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。