codeforces 725C Hidden word(构造)

点击打开链接

参考

//s[x]=s[y] 构造:则保证x与x-1,x+1,y-1,y+1相邻,其他的元素按照原来顺序放即可;  
// ..x开始顺势针放  dif/2 保证s[y-1]和s[x]相邻 (两行末尾为s[x]~s[dif/2],, s[y-1]~s[dif/2+1])

//s[y+1]~s[len-1] s[0]~s[x-1]连成一串 取0~12-dif/2,放到s[x]之前即可(y+1,s[x]相邻),

//剩下@~s[x-1]放到第二行即可

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int N=27;
char s[N+20];
int main()
{
	scanf("%s",s);
   	int len=strlen(s);
   	int x,y,z;//两个相同字符把字符串分成3段 
    for(int i=0;i<len-1;i++)//长度27,26种字符每种至少出现一次,有一种字符肯定出现两次 
	{
		for(int j=i+1;j<len;j++)
		{
			if(s[i]==s[j])
			{
				x=i;
				y=j;
				if(x+1==y)//两个相同的靠在一起 
				{
					cout<<"Impossible"<<endl;
					return 0;
				}
			}		
		}
	}	
	
	//s[x]=s[y] 构造:则保证x与x-1,x+1,y-1,y+1相邻,其他的元素按照原来顺序放即可;  
	// ..x开始顺势针放 分成3短 0~x-1 x~y-1 y+1~len 
	int dif=y-x-1;
	
    string q="";//第一行 
    string w="";//第二行 
 	string t="";
    q=q+s[x];
    // dif/2 保证s[y-1]和s[x]相邻
    for(int i=1;i<=dif/2;i++)
    {
    	q=q+s[x+i];//x~y之间前半部分放第一行 
	}
	for(int i=dif/2+1;i<=dif;i++)
	{
		w=s[x+i]+w;	//x~y后半部分 从第二行末尾倒着放(s[dif/2],s[dif/2+1]上下相邻)
		 
	} 
	for(int i=y+1;s[i];i++)
	{
		t=t+s[i];
	} 
	for(int i=0;i<x;i++)
	{
		t=t+s[i];//0~x-1
	}
	string t1=t.substr(0,12-dif/2);
	string t2=t.substr(12-dif/2,t.length()-(12-dif/2));
	reverse(t1.begin(),t1.end());//y+1要在x相邻	
	q=t1+q;
	w=t2+w;
	cout<<q<<endl;
	cout<<w<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值