CF1560E 题解
My Blog
题目大意
起初有一个小写字符串
已知
解题思路
先考虑怎么求删除顺序,首先可以确定的是,map 啥的求一下删除顺序。
在知道删除顺序以后,可以发现,每一个在第
然后发现样例最后一个有问题,如果一些无解情况,换了顺序不换字母数量就会被搞,所以最后要再按题意模拟一遍看看和
赛时由于前一天熬夜打派,困得头昏脑涨,没想到
Code
#pragma GCC optimize("Ofast,unroll-loops")
#include<bits/stdc++.h>
#define int long long
#define forr(i,l,r) for(register int i=l;i<=r;i++)
#define ffor(i,r,l) for(register int i=r;i>=l;i--)
using namespace std;
const int N=5e5+10;
int v[27];
int cc;
char ans[27];
int f[N];
string n;
signed main()
{
int t;
cin>>t;
flag:while(t--)
{
memset(v,0,sizeof(v));
forr(i,1,26)
{
ans[i]=' ';
}
cc=0;
cin>>n;
int l=n.size();
if(l==1)
{
cout<<n<<" "<<n<<endl;
continue;
}
n=' '+n;
ffor(i,l,1)
{
if(!v[n[i]-'a'])
{
ans[++cc]=n[i];
}
v[n[i]-'a']++;
}
int ll=0,e,o;
ffor(i,cc,1)
{
e=cc-i+1;
o=v[ans[i]-'a'];
if(o%e!=0)
{
puts("-1");
goto flag;
}
ll+=o/e;
}
memset(v,0,sizeof(v));
string q=" ",qq=" ";
forr(i,1,ll)
{
q+=n[i];
qq+=n[i];
}
ffor(i,cc,1)
{
v[ans[i]-'a']=1;
forr(j,1,qq.size()-1)
{
if(!v[qq[j]-'a'])
{
q+=qq[j];
}
}
}
if(q!=n)
{
puts("-1");
continue;
}
forr(i,1,qq.size()-1)
{
cout<<qq[i];
}
cout<<" ";
ffor(i,cc,1)
{
cout<<ans[i];
}
puts("");
}
}