[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 }
View Code

 

posted @ 2020-10-16 21:14  canwinfor  阅读(105)  评论(0)    收藏  举报