poj Shuffle'm Up (map + 模拟)
Map是标准关联式容器(associative container)之一,一个map是一个键值对序列,即(key ,value)对,Key - value的对应。key 和 value可以是任意你需要的类型。。它提供基于key的快速检索能力,在一个map中key值是唯一的。map提供双向迭代器,即有从前往后的(iterator),也有从后往前的(reverse_iterator)。
map要求能对key进行<操作,且保持按key值递增有序,因此map上的迭代器也是递增有序的。如果对于元素并不需要保持有序,可以使用hash_map。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。
#include<iostream> #include<string> #include<map> using namespace std; string s1,s2,s12,s; int t; void shuffle( ) { int i; s.clear(); for(i=0; i<t; i++) { s+=s2[i]; s+=s1[i]; } } int solve ( ) { int ans=1; map<string,bool> m; shuffle(); if (s==s12) return 1; while( m.find(s)==m.end() )/*没找到...find(k)简单地返回键值为k的元素的迭代器;如果没有元素的键值为k,则返回map的end()迭代器。*/
{ m[s]=true; s1=s.substr(0,t); //从零开始截取长度为t的字符串 s2=s.substr(t,t); //可以换为substring(t,2t)截取t到2t之间的字符串 shuffle(); ans++; if(s==s12) return ans; } return -1; } int main ( ) { int T,i; cin>>T; for (i=1; i<=T; i++) { cin>>t; cin>>s1>>s2>>s12; cout<<i<<" "<<solve()<<endl; } }