POJ 3087 模擬
阿新 • • 發佈:2019-02-04
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 模擬