#深搜#洛谷 1341 无序字母对

题目

找到一个n+1的字典序最小的字符串且相邻两个字母在字母对中(字母可以相反)


分析

首先先找奇点,再找偶点,然后深搜判断是否可行


代码

#include <cstdio>
#include <algorithm>
#define rr register
using namespace std;
int n,dep[61],start,mp[61][61],flag; char pre[101];
void dfs(int x,int dep){
    if (flag) return;
    pre[dep]=(x>26)?(x+70):(x+64);
    if (dep>n){flag=1; return;}
    for (rr int i=1;i<=52;++i) if (mp[x][i])
    --mp[x][i],--mp[i][x],dfs(i,dep+1),++mp[x][i],++mp[i][x];
}
signed main(){
    scanf("%d",&n);
    for (rr int i=1;i<=n;++i){
        rr char tmp[2];
        scanf("%s",tmp);
        tmp[0]=(tmp[0]>=97)?(tmp[0]-70):(tmp[0]-64);
        tmp[1]=(tmp[1]>=97)?(tmp[1]-70):(tmp[1]-64);
        ++mp[tmp[0]][tmp[1]],++mp[tmp[1]][tmp[0]],
        ++dep[tmp[0]],++dep[tmp[1]];
    }
    for (rr int i=1;i<=52&&!start;++i) start=i*(dep[i]&1);
    if (!start) for (rr int i=1;i<=52&&!start;++i)
    if (dep[i]) start=i; dfs(start,1);
    if (flag) for (rr int i=1;i<n+2;++i) putchar(pre[i]);
        else printf("No Solution");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值