POJ 3087 模拟
Posted stul
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); } }
以上是关于POJ 3087 模拟的主要内容,如果未能解决你的问题,请参考以下文章