问一个wa的问题

暑假里大家都学会了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;
}
10 个赞