codeforces1213F tarjan缩点+拓扑排序

题意

给定两个长度为n的排列p和q,构造一个字符串s满足\(s[p_i]<=s[p_{i+1}]\)\(s[q_i]<=s[q_{i+1}]\),且满足字符串中不同字符的个数不少于k。

分析

建一个有向图,\(p_i\)\(p_{i+1}\)连一条有向边,\(q_i\)\(q_{i+1}\)连一条有向边。

一条链上的点我们可以贪心的让每个点的字符递增,递增到‘z‘后,让其余字符全部等于‘z‘,而在同一个环中的所有点的字符一定是相同的,可以把所有环都缩成一个点,那么这张图就变成了有向无环图,可以直接拓扑排序做了。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define pb push_back
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,k;
int low[maxn],dfn[maxn],st[maxn],inst[maxn],top=-1,cnt,scnt,sc[maxn];
vector<int>g[maxn];
set<int>f[maxn];
int d[maxn],rk[maxn];
int res=-1;
void dfs(int u){
    dfn[u]=low[u]=++cnt;
    st[++top]=u;
    inst[u]=1;
    for(int x:g[u]){
        if(!dfn[x]){
            dfs(x);
            low[u]=min(low[u],low[x]);
        }else if(inst[x]){
            low[u]=min(low[u],dfn[x]);
        }
    }
    if(low[u]==dfn[u]){
        scnt++;
        while(true){
            int x=st[top--];
            sc[x]=scnt;
            inst[x]=0;
            if(x==u) break;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    //freopen("in","r",stdin);
    cin>>n>>k;
    int x,y;
    cin>>x;
    int rt=x;
    for(int i=1;i<n;i++){
        cin>>y;
        g[x].pb(y);
        x=y;
    }
    cin>>x;
    for(int i=1;i<n;i++){
        cin>>y;
        g[x].pb(y);
        x=y;
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i]) dfs(i);
    }
    for(int i=1;i<=n;i++){
        for(int x:g[i]){
            if(sc[i]!=sc[x]) f[sc[i]].insert(sc[x]);
        }
    }
    for(int i=1;i<=n;i++)
        for(int x:f[i])
            d[x]++;
    queue<int>q;
    int mx=-1;
    for(int i=1;i<=scnt;i++) rk[i]=-1;
    for(int i=1;i<=scnt;i++){
        if(d[i]==0) q.push(i),rk[i]=mx=0;
    }
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int x:f[u]){
            rk[x]=max(rk[u]+1,rk[x]);
            rk[x]=min(25,rk[x]);
            mx=max(mx,rk[x]);
            if(--d[x]==0) q.push(x);
        }
    }
    if(mx+1<k) cout<<"NO\n";
    else{
        cout<<"YES\n";
        for(int i=1;i<=n;i++){
            cout<<(char)(rk[sc[i]]+'a');
        }cout<<'\n';
    }
    return 0;
}
相关文章
相关标签/搜索
王中王鉄算盘开奖结果 http 沂南县| 禄劝| 高密市| 集安市| 安达市| 贵港市| 台北县| 土默特右旗| 丹巴县| 荣昌县| 大姚县| 垦利县| 调兵山市| 玉树县| 永年县| 昌宁县| 左权县| 班戈县| 杂多县| 吉林市| 磴口县| 凤山市| 宁河县| 宽甸| 双辽市| 吴堡县| 修水县| 丹东市| 建阳市| 新乐市| 临安市| 泸溪县| 田东县| 周至县| 民丰县| 乐昌市| 安徽省| 涿鹿县| 玛曲县| 肥东县| 天等县| 麻阳| 巴南区| 穆棱市| 怀化市| 海丰县| 金平| 台前县| 宁波市| 祁门县| 文化| 龙口市| 小金县| 漯河市| 丰镇市| 周口市| 舟曲县| 凤翔县| 逊克县| 保德县| 肇东市| 瓦房店市| 鸡西市| 菏泽市| 连城县| 承德市| 察隅县| 梨树县| 河源市| 长治市| 临海市| 阿坝| 淮滨县| 汨罗市| 浦北县| 绥德县| 观塘区| 寻甸| 钦州市| 穆棱市| 永仁县| 镇平县| 乐东| 冀州市| 双峰县| 策勒县| 方城县| 光山县| 凤冈县| 江油市| 聂拉木县| 正宁县| 会理县| 千阳县| 余干县| 闻喜县| 彭山县| 临海市| 临泽县| 苍山县| 黄大仙区| 闸北区| 凭祥市| 榆中县| 大田县| 射阳县| 阜南县| 金溪县| 正镶白旗| 牟定县| 永兴县| 长海县| 新兴县| 浦城县| 沾益县| 济阳县| 合川市| 合川市| 临澧县| 临澧县| 浦江县| 威海市| 介休市| 余庆县| 新宁县| 宁安市| 雅安市| 吕梁市| 巫山县| 嘉善县| 宜都市| 夹江县| 泸西县| 永寿县| 修文县| 麻江县| 仁寿县| 汶川县| 昌乐县| 宁安市| 荃湾区| 汕头市| 临沧市| 星座| 洛川县| 明水县| 南皮县| 虹口区| 南开区| 涿鹿县| 阿巴嘎旗| 杭锦旗| 顺平县| 梓潼县| 漳州市| 太仆寺旗| 永昌县| 乌鲁木齐县| 麻城市| 岐山县| 从江县| 晋宁县| 蒲城县| 姚安县| 和硕县| 宜良县| 泉州市| 东台市| 永康市| 阿合奇县| 潍坊市| 玉门市| 上饶市| 汕头市| 华亭县| 区。| 中江县| 贵定县| 和龙市| 西乌珠穆沁旗| 乐安县| 肥城市| 牡丹江市| 尼木县| 乐山市| 长泰县| 景泰县| 祁东县| 彰化市| 乾安县| 广水市| 合作市| 城固县| 华阴市| 巨野县| 辽源市| 宁强县| 安仁县| 化德县| 特克斯县| 台州市| 天水市| 邵阳县| 盘山县| 青阳县| 邳州市| 五原县| 海兴县| 赞皇县| 宜宾市| 河南省| 民和| 永嘉县| 岐山县| 平舆县| 红桥区| 永丰县| 贞丰县| 麟游县| 林芝县| 施秉县| 墨竹工卡县| 巴林左旗| 乌拉特后旗| 海安县| 阳城县| 江达县| 郴州市| 喀喇沁旗| 巴中市| 阿拉善左旗| 油尖旺区| 中阳县| 都匀市| 阿巴嘎旗| 彭水| 巴中市| 钟山县| 灵山县| 宣恩县| 全南县| 佛教| 五华县| 新民市| 双流县| 武安市| 洮南市| 连平县| 万山特区| 临西县| 榆树市| 平阳县| 北票市| 始兴县| 郧西县| 丰台区| 綦江县| 九江市| 乌恰县| 始兴县| 新巴尔虎左旗| 长顺县| 五原县| 漳平市| 大余县| 余干县| 长葛市| 安阳市| 蒙自县| 措勤县| 马关县| 巩义市| 同仁县| 新野县| 延边| 台湾省| 定襄县| 桃江县| 改则县| 鄂温| 钟山县| 淄博市| 万载县| 淮安市| 衡南县| 安龙县| 罗江县| 龙口市| 山东省| 遵化市| 乌兰县| 凌海市| 安顺市| 巴青县| 德化县| 资中县| 牡丹江市| 西畴县| 都匀市| 宜君县| 固始县| 冷水江市| 东辽县| 城市| 泌阳县| 湟源县| 驻马店市| 敦煌市| 合阳县| 巢湖市| 密云县| 大埔县| 新闻| 车险| 大名县| 梅河口市| 桦川县| 伊春市| 长丰县| 乾安县| 永州市| 鱼台县| 宜黄县| 治多县| 襄城县| 锡林郭勒盟| 抚松县| 兴宁市| 安塞县| 平泉县| 乡宁县| 宜昌市| 南平市| 莒南县| 杭州市| 阿克| 依兰县| 威远县| 松溪县| 三穗县| 梨树县| 来宾市| 玉树县| 盘山县| 佳木斯市| 淳化县| 方正县| 晋宁县| 镇远县| 弥渡县| 遂宁市| 含山县| 房产| 德安县| 达日县| 无为县| 小金县| 达尔| 铜川市| 育儿| 固原市| 景东| 西安市| 奉节县| 虞城县| 禹州市| 牡丹江市| 依安县| 南投县| 开封市| 白水县| 余干县| 广汉市| 阿勒泰市| 建平县| 瑞丽市| 安塞县| 八宿县| 红河县| 开阳县| 嘉鱼县| 东乌珠穆沁旗| 四平市| 民勤县| 桑日县| 吉林市| 黑水县| 敦化市| 延边| 德钦县| 门源| 芦山县| 从江县| 朝阳县| 新营市| 阿图什市| 三台县| 施秉县| 滨州市| 肇源县| 牟定县| 福州市| 察哈| 阿拉尔市| 章丘市| 万源市| 大名县| 社旗县| 白玉县| 兴隆县| 泰来县| 岱山县| 嘉善县| 玉屏| 灵宝市| 徐汇区| 固原市| 虹口区| 沐川县| 如东县| 岑溪市| 阿瓦提县| 新建县| 高陵县| 阿合奇县| 根河市| 肥城市| 新昌县| 政和县| 上高县| 探索| 开原市| 三穗县| 平谷区| 永寿县| 逊克县| 改则县| 和田县| 开原市| 罗江县| 延川县| 易门县| 广元市| 永川市| 桃源县| 江山市| 泾源县| 东山县| 和田市| 临邑县| 冕宁县| 三江| 博客| 洛浦县| 达拉特旗| 长春市| 肥城市| 松阳县| 闽清县| 瑞安市| 巩义市| 凤城市| 安康市| 宁化县| 台湾省| 泰兴市| 获嘉县| 观塘区| 二连浩特市| 屯门区| 阿拉善盟| 合肥市| 柳江县| 达日县| 福州市| 准格尔旗| 天气| 梓潼县| 青州市| 馆陶县| 耒阳市| 永和县| 十堰市| 萨嘎县| 遵化市| 尤溪县| 崇仁县| 来凤县| 罗平县| 子长县| 措美县| 武隆县| 县级市| 桂东县| 屏南县| 新竹市| 德州市| 扶余县| 澄江县| 临漳县| 庆云县| 天门市| 正安县| 仁布县| 昌黎县| 航空| 三穗县| 平远县| 东海县| 麻阳| http://www.bo2020bushs.fun http://www.yqo4j8rl2v.fun http://m.gz1980izpactc.fun http://m.bo2020networks.fun http://wap.yqo2j2rl8v.fun http://m.gz1980colourc.fun http://www.bo2020powers.fun http://www.yqo1j7rl2v.fun http://wap.yqo5j5rl4v.fun http://m.gz1980lizitc.fun http://www.bo2020pays.fun http://wap.bo2020hills.fun http://wap.yqo5j2rl7v.fun http://www.gz1980zouthc.fun http://wap.gz1980zeterc.fun