题意:洗扑克,两堆 S1, S2 各有 C 个扑克。先从 S2 最下面拿一张放在新的一堆的最下面,再拿 S1 的最下面一张往上放,以此类推最后形成 2*C 个扑克组成的堆。上 C 个是新的 S2,下 C 个是新的 S1。问多少次能匹配上给定的顺序。
思路:set 存储字符串,find 方法判断是否有重复的。如果有重复的意味着构成一个循环节,如果还没匹配上就再也匹配不上了。(注意输入的字符串最左面是底部)
#include<iostream> #include<cmath> #include<queue> #include<cstring> #include<string> #include<set> #include<cstdio> #include<algorithm> using namespace std; int main(){ //freopen("a.txt", "r", stdin); int N; cin >> N; for(int k = 1; k <= N; k++){ int ans = 0, l; string s1, s2, s3; cin >> l >> s1 >> s2 >> s3; set<string> s; while(1){ string s4; for(int i = 0; i < l; i++){ s4 += s2[i]; s4 += s1[i]; } for(int i = 0; i < l; i++){ s1[i] = s4[i]; s2[i] = s4[i+l]; } ans++; if(s4 == s3) break; if(s.find(s4) == s.end()) s.insert(s4); else{ ans = -1; break; } } printf("%d %dn", k, ans); } return 0; }