bzoj 4974 字符串大师

本文介绍了一种基于NXT数组构建字符串的算法,通过判断NXT数组元素是否为0来决定字符赋值策略。若NXT数组元素不为0,则直接赋值;若为0,则从'a'到'z'中选择未被前序节点使用的最小字符进行填充。此算法确保了生成字符串的唯一性和合法性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相当于告诉你nxt数组
如果nxt!=0,那么直接赋值。
否则选一个可以选的最小值即可。

#include<bits/stdc++.h>
#define gc getchar()
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define db double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
    int x,ch;while((ch=gc)<'0'||ch>'9');
    x=ch^'0';while((ch=gc)>='0'&&ch<='9')
        x=(x<<1)+(x<<3)+(ch^'0');return x;
}
char s[100010];bool ban[100];int nxt[100010];
int main()
{
    int n=inn();
    rep(i,1,n)
    {
        int x=i-inn();nxt[i]=x;
        if(i==1) s[1]='a';
        else if(!x)
        {
            memset(ban,false,sizeof(bool)*(30));
            for(int j=i-1;j;j=nxt[j])
                ban[s[nxt[j]+1]-'a']=1;
            rep(j,'a','z') if(!ban[j-'a']) { s[i]=j;break; }
        }
        else{
            s[i]=s[x];
        }
        printf("%c",s[i]);
    }
    return !printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值