uva-1399 Puzzle

链接

https://vjudge.net/problem/UVA-1399

题解

建立 T r i e Trie Trie
判断是否是 D A G DAG DAG
如果有环,无解
否则跑拓扑排序
倒着 d p dp dp
记录决策

代码

#include <bits/stdc++.h>
#define maxn 50010
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
int n;
struct Graph
{
    int etot, head[maxn], to[maxn*26], next[maxn*26], w[maxn*26], in_deg[maxn], N;
    vector<int> list;
    void clear()
    {
        int i;
        list.clear();
        for(i=1;i<=N;i++)head[i]=0, in_deg[i]=0;
        for(i=1;i<=etot;i++)to[i]=next[i]=w[i]=0;
        N=etot=0;
    }
    void adde(int a, int b, int c)
    {
        to[++etot]=b;w[etot]=c;next[etot]=head[a];head[a]=etot;
        in_deg[b]++;
    }
    void topo()
    {
        queue<int> q;
        int u, v;
        for(int i=1;i<=N;i++)if(in_deg[i]==0)q.emplace(i);
        while(!q.empty())
        {
            u=q.front(); q.pop();
            list.emplace_back(u);
            for(auto p=head[u];p;p=next[p])
            {
                in_deg[to[p]]--;
                if(in_deg[to[p]]==0)
                {
                    q.emplace(to[p]);
                }
            }
        }
    }
}G;
struct ACautomaton
{
    int trie[maxn][30], tot, fail[maxn], tail[maxn];
    void clear()     //clear the arrays
    {
        for(int i=1;i<=tot;i++)cl(trie[i]), fail[i]=tail[i]=0;
        tot=1;
    }
    int insert(int *r, int len)     //insert a string into trie tree
    {
        auto pos=1;
        for(auto i=1;i<=len;i++)
            pos = trie[pos][r[i]] ? trie[pos][r[i]] : trie[pos][r[i]]=++tot;
        tail[pos]++;
        return pos;
    }
    void build()    //build the aca
    {
        queue<int> q;
        int u, v, f;
        q.push(1);
        while(!q.empty())
        {
            u=q.front(); q.pop();
            for(auto i=1;i<=n;i++)
                if(trie[u][i])
                {
                    v=trie[u][i];
                    for(f=fail[u];f and !trie[f][i];f=fail[f]);
                    fail[v] = f ? trie[f][i] : 1;
                    tail[v]+=tail[fail[v]];
                    q.push(v);
                }
        }
    }
    int move(int pos, int c)
    {
        for(;pos and !trie[pos][c];pos=fail[pos]);
        return pos ? trie[pos][c] : 1;
    }
}aca;
int read(int x=0)
{
    int c, f(1);
    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    for(;isdigit(c);c=getchar())x=x*10+c-48;
    return f*x;
}
int f[maxn], alpha[maxn];
void dp()
{
    int i, j;
    for(i=1;i<=G.N;i++)f[i]=alpha[i]=0;
    for(auto it=G.list.rbegin();it!=G.list.rend();it++)
    {
        if(!aca.tail[*it])f[*it]=1;
        else continue;
        for(auto p=G.head[*it];p;p=G.next[p])
        {
            if(aca.tail[G.to[p]])continue;
            if(f[*it]<f[G.to[p]]+1)
            {
                f[*it]=f[G.to[p]]+1;
                alpha[*it]=G.w[p];
            }
            else if(f[*it]==f[G.to[p]]+1 and G.w[p]>alpha[*it])
            {
                alpha[*it]=G.w[p];
            }
        }
    }
}
void display()
{
    for(auto x=1;alpha[x];x=aca.move(x,alpha[x]))putchar(alpha[x]+'A'-1);
    putchar(10);
}
char s[maxn];
int r[maxn];
int main()
{
    int T(read()), m;
    while(T--)
    {
        aca.clear();
        G.clear();
        
        //初始化自动机
        n=read(), m=read();
        for(auto i=1;i<=m;i++)
        {
            scanf("%s",s+1);
            auto len=strlen(s+1);
            for(auto i=1;i<=len;i++)r[i]=s[i]-'A'+1;
            aca.insert(r,len);
        }
        aca.build();

        //建图
        G.N=aca.tot;
        for(auto i=1;i<=aca.tot;i++)
        {
            if(aca.tail[i])continue;
            for(auto alpha=1;alpha<=n;alpha++)
            {
                G.adde( i, aca.move(i,alpha), alpha);
            }
        }

        //拓扑排序
        G.topo();
        if(G.list.size() != G.N)    //存在环,无解
        {
            printf("No\n");
            continue;
        }

        dp();
        if(f[1]==1)
        {
            printf("No\n");
            continue;
        }
        display();
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。
vue-puzzle是一个Vue.js的人机验证组件,它可以用于在前端实现拼图验证码功能。 该组件可以用于替代第三方SDK的拼图验证,避免了引入SDK和后台配合的麻烦。你只需要通过npm安装vue-puzzle-vcode即可开始使用。 使用vue-puzzle-vcode时,你需要在代码中引入Vcode组件并使用它来展示验证模态框。你可以设置show属性来控制模态框的显示与隐藏,通过onSuccess事件来处理用户通过验证后的逻辑,通过onClose事件来处理关闭模态框的逻辑。 在示例中,当用户点击登录按钮时,会触发onSubmit方法,使验证码模态框显示出来。当用户通过验证后,会触发onSuccess方法,你需要在该方法中手动隐藏模态框。当用户点击遮罩层时,会触发onClose方法,你需要在该方法中关闭模态框。 除了以上提到的参数外,vue-puzzle还提供了其他可配置的参数,你可以根据需求进行设置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue拼图验证组件使用教程](https://blog.csdn.net/weixin_40121676/article/details/102895804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue 使用vue-puzzle-vcode拼图验证纯前端实现](https://blog.csdn.net/qq_37816525/article/details/102560656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值