Plot the function 使用numpy matplotlib 繪製函式
阿新 • • 發佈:2022-05-16
本來就是個裸的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; }