思路讲解
这个视频讲解还不错
AC代码
https://www.acwing.com/problem/content/submission/code_detail/38373269/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> #include <cctype>
using namespace std; typedef long long ll; const ll N=static_cast<ll>(1e5)+10,N2=1e6+10; ll n,m; char P[N],S[N2]; ll nxt[N];
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>P+1>>m>>S+1; for(int i=2,j=0;i<=n;++i){ while (j && P[i]!=P[j+1]) j=nxt[j]; if(P[i]==P[j+1]) ++j; nxt[i]=j; } for(int i=1,j=0;i<=m;++i){ while (j && S[i]!=P[j+1]) j=nxt[j]; if(S[i]==P[j+1]) ++j; if(j==n){ cout<<i-j<<" "; } } cout<<"\n"; }
|
心路历程(WA,TLE,MLE……)
自己写的,稍微有点问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> #include <cctype>
using namespace std; typedef long long ll; const ll N=static_cast<ll>(1e5)+10,N2=1e6+10; ll n,T,n2; char P[N],S[N2]; ll nxt[N];
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;++i){ cin>>P[i]; } cin>>n2; for(int i=1;i<=n2;++i){ cin>>S[i]; } for(int i=2;i<=n;++i){ if(P[i]==P[nxt[i-1]+1]) nxt[i]=nxt[i-1]+1; else nxt[i]=0; } vector<ll> ans; for(int i=1,j=1;i<=n2;++i){ if(S[i]==P[j]){ if(j==n){ ans.push_back(i-j); j=nxt[j-1]+2; }else{ ++j; } }else{ if(i==n2) break; j=nxt[j-1]+2; } } for(int i=0;i<ans.size();++i) cout<<ans[i]<<" "; cout<<endl; }
|