zoukankan      html  css  js  c++  java
  • 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();
    	}
    	
    } 
    


  • 相关阅读:
    flutter 反序列化
    系统架构师-系统开发基础
    java Lambda表达式
    java异常
    HTTP缓存了解(一)
    设计模式(一):策略模式
    配置自己的ubuntu
    正则表达式:贪婪与非贪婪
    .htaccess文件
    mysql协议简析
  • 原文地址:https://www.cnblogs.com/stul/p/10351565.html
Copyright © 2011-2022 走看看