[USACO15FEB]Censoring S ###K ###K //K
题目链接:https://ac.nowcoder.com/acm/contest/955/F
思路: 先考虑暴力, 用s来一个个的匹配t 然后删除的话就用栈去维护,每个i记录下匹配到t的第几个字母
然后 删除后能够更新匹配到第几个 然后每个数只会进出栈一次 所有进出栈的时间复杂度o n
但是匹配的过程要 o n^2 所以考虑用kmp优化匹配过程 将复杂度降到o n 然后这里用数组栈模拟的话更好写
因为可以直接倒序输出 不用再翻转一次 并且 用下标删除数 更快更好写
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+10; 4 const int mod=1e9+7; 5 #define ll long long 6 #define ull unsigned long long 7 #define pi pair<int,int> 8 #define fi first 9 #define sc second 10 #define pb push_back 11 12 13 char s[maxn],t[maxn]; 14 int nxt[maxn]; 15 16 int stk[maxn]; 17 int tt; 18 int p[maxn]; 19 20 int main() 21 { 22 ios::sync_with_stdio(false); 23 cin.tie(0); 24 cin>>(s+1)>>(t+1); 25 int n=strlen(s+1),m=strlen(t+1); 26 for(int i=2,j=0;i<=m;i++) 27 { 28 while(j&&t[i]!=t[j+1]) j=nxt[j]; 29 if(t[i]==t[j+1]) j++; 30 nxt[i]=j; 31 } 32 33 for(int i=1,j=0;i<=n;i++) 34 { 35 while(j&&s[i]!=t[j+1]) j=nxt[j]; 36 if(s[i]==t[j+1]) j++; 37 stk[++tt]=i; 38 p[i]=j; 39 if(j==m) 40 { 41 tt-=m; 42 j=p[stk[tt]]; 43 } 44 } 45 for(int i=1;i<=tt;i++) cout<<s[stk[i]]; 46 47 48 49 }
                    
                
                
            
        
浙公网安备 33010602011771号