POJ 3087 模拟

给定两个长度为len的字符串s1和s2, 接着给出一个长度为len*2的字符串s12。

将字符串s1和s2通过一定的变换变成s12,找到变换次数

变换规则如下:

假设s1=12345,s2=67890

变换后的序列 s=6172839405

如果s和s12完全相等那么输出变换次数

如果不完全相等,s的前半部分作为s1,后半部分作为s2,重复上述过程。

Input

第一行给出T(1≤T≤1000),代表有T组数据,每组数据首先给出len(1≤len≤100),接着给出两个长度为len的字符串s1 s2 然后给出长度为len*2的字符串s12。

Output

首先输出处理数据组的编号(编号从1开始)

再输出变换次数并换行。

注意两个数字之间有空格。

对于变换次数,如果无需变换直接得到s12,那么输出0,如果无论怎么变换都不会得到s12,那么输出 -1。

Sample Input

2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC

Sample Output

1 2
2 -1

用到的知识:
1.首先是set,用于判断在若干次交换以后,是否存在重复的元素。
set<string>tmp;
tmp.find(s) 找到s在tmp这个容器里面的位置,返回值是一个迭代器。
tmp.end() 容器的末尾。
tmp.insert(s)把s这个串插入到tmp里面。
2.string
s.push_back( )在s的尾部插入一个字符。
s1.assign(s.begin(),s.begin+s.length())给s1赋值,形参是两个迭代器。

这里还可以用s1 = s.substr(0,mid); s2 = s.substr(mid,2*mid) substr函数是取字符的字串,形参是区间边界。


#include <iostream>
#include <string>
#include <set>
using namespace std;

string s1,s2,s12;
int mid;
set<string> tmp;

int main()
{
	int n;
	cin>>n;int l = n;
	while(n--)
	{
		int count = 1;
		cin>>mid;
		cin>>s1>>s2>>s12;
		while(1)
		{
			string s;
			for(int i = 0; i < mid; i++)
				s.push_back(s2[i]),s.push_back(s1[i]);
			if(s == s12)  { cout<<l-n<<" "<<count<<endl; break; } 
			
			if(tmp.find(s) == tmp.end()) tmp.insert(s); //在tmp容器里面寻找s,未找到,返回的迭代器就是tmp.end(),就插入s。
			
			else{cout<<l-n<<" "<<-1<<endl; break;}
			
			s1.assign(s.begin(),s.begin()+mid);
			s2.assign(s.begin()+mid,s.begin()+2*mid);
			count++;
		}
		tmp.clear();
	}
	
} 


猜你喜欢

转载自www.cnblogs.com/stul/p/10351565.html