题目链接
https://www.luogu.org/problemnew/show/P1032
分析
这题本来很裸的一个BFS,发现其中的字符串操作好烦啊。然后就翻大佬题解发现用STL中的string居然变得这么简洁!!!
各种string操作请看另一位大佬博客,写得很全啊:
https://www.cnblogs.com/rvalue/p/7327293.html#commentform
其实我们这题只用到两个相关函数:$S.find(string,pos)$和$S.substr()$
前一个是朴素查找,后一个是子串替换,用法都在那个大佬博客中有
代码
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
| #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <string> #include <queue> #include <iostream> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/hash_policy.hpp> #define ll long long #define ri register int #define mkp make_pair using namespace std; using namespace __gnu_pbds; template <class T>inline void read(T &x){ x=0;int ne=0;char c; while(!isdigit(c=getchar()))ne=c=='-'; x=c-48; while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48; x=ne?-x:x;return ; } const int maxn=25; const int inf=0x7fffffff; pair<string,string> pi[maxn],TMP; int ans=0,cnt=0; gp_hash_table <string,bool> g; string A,B; struct Dat{ string p; int step; Dat(){;} Dat(string _p,int _s){p=_p;step=_s;} }Tmp; queue< Dat > q; int main(){ string a,b; int t,pos; std::ios_base::sync_with_stdio(0); cin.tie(0); cin>>A>>B; while(cin>>a>>b){ pi[++cnt]=mkp(a,b); } q.push(Dat(A,0)); g[A]=1; while(q.size()){ Tmp=q.front(); A=Tmp.p,t=Tmp.step;q.pop(); if(A==B){ ans=t; if(t<10){printf("%d\n",t);} else puts("NO ANSWER"); return 0; } for(ri i=1;i<=cnt;i++){ a=pi[i].first; pos=A.find(a); while(pos!=A.npos){ b=A.substr(0,pos); b+=pi[i].second; b+=A.substr(pos+a.size()); if(!g[b]){ q.push(Dat(b,t+1)); g[b]=1; } pos=A.find(a,pos+1); } } } puts("NO ANSWER"); return 0; }
|