topcoder srm 663 div1 -23
Posted Only the Strong Survive
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了topcoder srm 663 div1 -23相关的知识,希望对你有一定的参考价值。
1、给定两个只包含AB的字符串$S,T$。问是否存在一种操作序列将$S$变成$T$。操作有两种:(1)在$S$后加一个‘A’;(2)在$S$后加一个‘B‘并反转整个串。
思路:每次枚举$S$的两种变化,并判断新的串是否是$T$的子串。不是的话停止搜索。
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <cstring> using namespace std; const int mod=1000000007; set<string> S[55]; int check(string s) { return S[s.size()].find(s)!=S[s.size()].end(); } string T; int dfs(string a,int n) { if(a.size()==n) { return a==T; } if(check(a+‘A‘)&&dfs(a+‘A‘,n)) { return 1; } a+=‘B‘; reverse(a.begin(),a.end()); if(check(a)&&dfs(a,n)) return 1; return 0; } class ABBADiv1 { public: string canObtain(string a,string b) { for(int i=0;i<55;++i) S[i].clear(); for(int i=0;i<(int)b.size();++i) { for(int j=i;j<(int)b.size();++j) { int L=j-i+1; string s=b.substr(i,L); S[L].insert(s); reverse(s.begin(),s.end()); S[L].insert(s); } } T=b; if(dfs(a,(int)b.size())) return "Possible"; return "Impossible"; } };
以上是关于topcoder srm 663 div1 -23的主要内容,如果未能解决你的问题,请参考以下文章