1. 程式人生 > 其它 >一文搞懂 ElasticSearch 之 Mapping

一文搞懂 ElasticSearch 之 Mapping

題面

本來就是個裸的KMP,但是這個題是有刪除的,所以可以維護一個棧,每次的 \(j\) 都繼承棧頂元素的 \(j\),然後如果找到了一個匹配,就直接彈棧即可。因為只會進棧 \(O(n)\) 次,所以總複雜度也是 \(O(n)\) 的。這個題算是棧的妙用了。

點選檢視程式碼
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
const int N=1e6+13;
char s[N],t[N];
bool vis[N];
int n,m,nxt[N],pos[N];
inline void init(){
	nxt[1]=0;
	for(int i=2,j=0;i<=m;++i){
		while(j&&t[j+1]!=t[i]) j=nxt[j];
		if(t[j+1]==t[i]) ++j;
		nxt[i]=j;
	}
}
inline void KMP(){
	stack<int> st;st.push(0);
	for(int i=1;i<=n;++i){
		int j=pos[st.top()];
		while(j&&t[j+1]!=s[i]) j=nxt[j];
		if(t[j+1]==s[i]) ++j;
		if(j==m){
			vis[i]=1,--j;
			while(j--) vis[st.top()]=1,st.pop();
		}
		else st.push(i),pos[i]=j;
	}
}
int main(){
	scanf("%s%s",s+1,t+1);n=strlen(s+1),m=strlen(t+1);
	init();KMP();
	for(int i=1;i<=n;++i)
		if(!vis[i]) printf("%c",s[i]);
	return 0;
}