1. 程式人生 > >POJ 3087 模擬

POJ 3087 模擬

http 容器 分享 技術 重復 位置 class pac 給定

給定兩個長度為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();
	}
	
} 



POJ 3087 模擬