POJ 3087(模拟)

题意:

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

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

变换规则如下:

假设s1=12345,s2=67890

变换后的序列 s=6172839405

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

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

思路:按题意模拟就行了,没什么难度。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
int len,flag=0;
map<string,int> mp;
string s12;
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    int t,cas=0;
    cin>>t;
    while(t--)
    {
        flag=0;
        mp.clear();
        cin>>len;
        string s1,s2;
        cin>>s1>>s2>>s12;
        string tmp="";
        for(int i=0; i<len; i++)
        {
            tmp=tmp+s2[i]+s1[i];
        }
        cout<<++cas<<" ";
        int time=1;
        mp[tmp]=1;
   //     cout<<tmp<<endl;
        while(tmp.compare(s12)!=0)
        {
            for(int i=0; i<len; i++)
            {
                s1[i]=tmp[i];
            }
            for(int i=len; i<2*len; i++)
            {
                s2[i-len]=tmp[i];
            }
            int g=0;
            for(int i=0;i<2*len;i+=2)
            {
                tmp[i]=s2[g];
                tmp[i+1]=s1[g++];
            }
      //      cout<<tmp<<endl;
            if(mp[tmp]==1)
            {
                cout<<-1<<endl;
                flag=1;
                break;
            }

            mp[tmp]=1;
            time++;
        }
        if(!flag)
        {
            cout<<time<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dilly__dally/article/details/82655319