思路:
- 管什么颜色不颜色,就是串串。
- 模拟题。
- (第一次)用 map,判断每次得到的串串是不是新串,如果不是就 continue,是则 break 输出 -1。
- 因为每一个串只有一种产生方法,其左串和右串都是固定的,那么利用反证法,环路不可能突然成在中间,那样会导致某个串有两个不同的来源。因此,环路必然经过首串。所以,只需要判断每一次产生的串是否与第一次得到的串串相同即可。
- 注意:
- 第一种代码中混用了 m.empty() 和 m.clear(),找了好久好久。很生气。
- 第二种代码中第一次 while 不可以判断 rep 和 temp。
代码:
#include <iostream>
#include <map>
#include <string>
using namespace std;
map<string , bool> book;
int n;
int ans;
string tar;
void init(){
book.clear();
ans = 0;
}
string com(string l , string r){
string temp ;
for(string::iterator il = l.begin() , ir = r.begin() ; il != l.end() ; il++ , ir++){
temp += *ir;
temp += *il;
}
ans++;
return temp;
}
int main(){
int T;cin>>T;
for(int t=1;t<=T;t++){
init();
cin>>n;
string l,r;
string temp;
cin>>l>>r;
cin>>tar ;
temp = com(l , r);
while(true){
if(temp == tar)
break;
if(book[temp]){
ans = -1;
break;
}
book[temp] = true;
l.clear() , r.clear();
for(string::iterator i = temp.begin() ; i-temp.begin()!=n ; i++)
l += *i;
for(string::iterator i = temp.begin() + n ; i != temp.end() ; i++)
r += *i;
temp = com(l , r);
}
cout<<t<<' '<<ans<<endl;
}
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int n;
int ans;
bool fir;
string tar;
void init(){
ans = 0;
fir = true;
}
string com(string l , string r){
string temp ;
for(string::iterator il = l.begin() , ir = r.begin() ; il != l.end() ; il++ , ir++){
temp += *ir;
temp += *il;
}
ans++;
return temp;
}
int main(){
int T;cin>>T;
for(int t=1;t<=T;t++){
init();
cin>>n;
string l,r;
string temp;
string rep ;
cin>>l>>r;
cin>>tar ;
rep = temp = com(l , r);
while(true){
if(temp == tar)
break;
if(!fir && temp == rep){
ans = -1;
break;
}
fir = false;
l.clear() , r.clear();
for(string::iterator i = temp.begin() ; i-temp.begin()!=n ; i++)
l += *i;
for(string::iterator i = temp.begin() + n ; i != temp.end() ; i++)
r += *i;
temp = com(l , r);
}
cout<<t<<' '<<ans<<endl;
}
return 0;
}