暑假里大家都学会了AC自动机,于是小伙伴们跃跃欲试想学各种神机。第一个就是左右构造机。
给你一个数组S,包含n个元素,S[0]的左边是S[n-1], S[n-1]的右边是S[0]
再给你一个目标数组T,每次你可以对S做的操作有如下两种
L:每个数都加上左边的数
R:每个数都加上右边的数
所有的加法都是瞬间同时完成,随意输出一个可以使得S变成T的操作序列
序列长度不超过100
这是我得到了40分的代码
请帮忙康康怎么回事
#include <iostream>
#include <cstdlib>
#include <ctime>
#define int long long
using namespace std;
signed main(){
int n,s[1001]={},t[1001]={},ss=0,st=0,cnt=0,rx;
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i],ss+=s[i];
for(int i=1;i<=n;i++) cin>>t[i],st+=t[i];
if(ss==0&&st!=0){
cout<<"No solution"<<endl;
return 0;
}else if(ss==0&&st==0){
cout<<"null"<<endl;
return 0;
}
bool nullflag=true;
for(int i=1;i<=n;i++) if(s[i]!=t[i]){
nullflag=false;
break;
}
if(nullflag) cout<<"null"<<endl;
else{
if(st%ss!=0) cout<<"No solution"<<endl;
else{
bool nos=false;
rx=st/ss;
while(rx>1){
if(rx%2!=0){
nos=true;
break;
}else rx/=2,cnt++;
}
if(nos||cnt==0) cout<<"No solution"<<endl;
else{
int knt=cnt;
while(knt--){
int r[1001]={};
r[1]=s[1]+s[n];
for(int i=2;i<=n;i++) r[i]=s[i]+s[i-1];
for(int i=1;i<=n;i++) s[i]=r[i];
}
int rs=0;
bool getans=false;
for(int i=1;i<=n;i++){
bool flag=true;
for(int j=1;j<=n;j++) if(s[j]!=t[j]){
flag=false;
break;
}
if(flag){
int ls=cnt-rs;
for(int i=1;i<=ls;i++) cout<<"L";
for(int i=1;i<=rs;i++) cout<<"R";
getans=true;
cout<<endl;
break;
}else{
int r[1001]={};
r[n]=s[1];
for(int j=1;j<n;j++) r[j]=s[j+1];
for(int j=1;j<=n;j++) s[j]=r[j];
rs++;
}
}
if(!getans) cout<<"No solution"<<endl;
}
}
}
return 0;
}