首页 > 其他分享 >「ABC374G」 Only One Product Name

「ABC374G」 Only One Product Name

时间:2024-12-20 15:46:53浏览次数:5  
标签:tmp Name ll st Only maxn low lvl ABC374G

题意

给 \(n\) 个长度为 \(2\),互不相同,且只由大写字母组成的字符串 \(s\)。

你需要构造出一个字符串数组 \(t\),使得对于每一个 \(s_i\),存在 \(t_j\) 使得 \(s_i\) 为 \(t_j\) 的一个连续子串。并且对于每一个 \(t_j\),它的任意一个连续长度为 \(2\) 的子串都在 \(s\) 中。

求出数组 \(t\) 大小的最小值。

分析

考虑把符合条件的串接起来,这就很像接龙。

一个比较明显的思路就是把尾和头相同的 \(s\) 连边,然后去找最少需要几条路径可以覆盖全部点,就是网络流的最小可相交路径覆盖的板子。

因为原图可能有环,所以缩点之后重新连边,传递闭包后直接跑 dinic 就可以了。

赛时代码写的不可相交,赛后改了 10min 就过了。。。

Code

#include<bits/stdc++.h>
typedef int ll;
using namespace std;
// static char buf[100],*p1=buf,*p2=buf,obuf[100],*p3=obuf;
// #define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,100,stdin),p1==p2)?EOF:*p1++
// #define putchar(x) (p3-obuf<100)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count());
#define dbg(x) cout<<#x<<": "<<x<<"\n"
inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;}
inline void write(ll x){if(!x){putchar(48);putchar('\n');return;}short top=0,s[40];if(x<0)x=-x,putchar(45);while(x)s[top++]=x%10^48,x/=10;while(top--)putchar(s[top]);putchar('\n');}
namespace tobe{
    const ll maxn=1e3+5,maxt=2e6+5,mod=998244353;
    ll n,s,t,tot=1,head[maxn],lvl[maxn],now[maxn];
    string str[maxn];
    struct edge{
        ll to,nxt,val;
    }e[maxt];
    inline void add(ll u,ll v,ll w){
        e[++tot]=(edge){v,head[u],w};
        head[u]=tot;
        e[++tot]=(edge){u,head[v],0};
        head[v]=tot;
    }
    inline bool bfs(){
        memset(lvl,0,sizeof(lvl));lvl[s]=1;
        queue<ll>q;q.push(s);now[s]=head[s];
        while(!q.empty()){
            ll u=q.front();q.pop();
            for(ll i=head[u];i;i=e[i].nxt){
                ll v=e[i].to,w=e[i].val;
                if(w>0&&!lvl[v]){
                    lvl[v]=lvl[u]+1;
                    q.push(v);now[v]=head[v];
                    if(v==t)return 1;
                }
            }
        }
        return 0;
    }
    inline ll dfs(ll u,ll f){
        if(u==t)return f;
        ll tmp=f;
        for(ll i=now[u];i&&tmp;i=e[i].nxt){
            ll v=e[i].to,w=e[i].val;now[u]=i;
            if(w&&lvl[v]==lvl[u]+1){
                ll k=dfs(v,min(w,tmp));
                if(!k)lvl[v]=0;
                e[i].val-=k,e[i^1].val+=k;
                tmp-=k;
            }
        }
        return f-tmp;
    }
    ll dfn[maxn],low[maxn],tmp,cnt,col[maxn],siz[maxn];
    bool vis[maxn],f[maxn][maxn];
    vector<ll>son[maxn];
    stack<ll>st;
    inline void tarjan(ll u){
        dfn[u]=low[u]=++tmp,vis[u]=1;st.push(u);
        for(auto v:son[u]){
            if(!dfn[v]){
                tarjan(v);low[u]=min(low[u],low[v]);
            }
            else if(vis[v])low[u]=min(low[u],dfn[v]);
        }
        if(dfn[u]==low[u]){
            ++cnt;
            while(st.top()!=u)col[st.top()]=cnt,++siz[cnt],vis[st.top()]=0,st.pop();
            col[u]=cnt,vis[u]=0,st.pop();
        }
    }
    inline void mian(){
        n=read();
        for(ll i=1;i<=n;++i){
            cin>>str[i];
        }
        for(ll i=1;i<=n;++i){
            for(ll j=1;j<=n;++j){
                if(str[i][1]==str[j][0]){
                    son[i].push_back(j);
                }
            }
        }
        for(ll i=1;i<=n;++i)if(!dfn[i])tarjan(i);
        s=0,t=cnt*2+1;
        for(ll i=1;i<=n;++i){
            for(auto j:son[i]){
                if(col[i]!=col[j]){
                    f[col[i]][col[j]]=1;
                }
            }
        }
        for(ll k=1;k<=cnt;++k){
            for(ll i=1;i<=cnt;++i){
                for(ll j=1;j<=cnt;++j){
                    f[i][j]|=f[i][k]&f[k][j];
                }
            }
        }
        for(ll i=1;i<=cnt;++i){
            add(s,i,1),add(i+cnt,t,1);
            for(ll j=1;j<=cnt;++j){
                if(f[i][j])add(i,j+cnt,1);
            }
        }
        ll ans=0;
        while(bfs())ans+=dfs(s,INT_MAX);
        write(cnt-ans);
    }
}
signed main(){
    // freopen(".in","r",stdin);
    // freopen(".out","w",stdout);
    ll t=1;
    while(t--)tobe::mian();
    // fwrite(obuf,p3-obuf,1,stdout);
    return 0;
}

标签:tmp,Name,ll,st,Only,maxn,low,lvl,ABC374G
From: https://www.cnblogs.com/run-away/p/18619405

相关文章

  • Ubuntu系统部署程序:修改IP、部署docker、nginx、Redis、onlyoffice、java
    记录一次Ubuntu系统的程序部署修改IP#修改IPvim/etc/network/interfacesautoens33ifaceens33inetstaticaddress192.?.?.?netmask255.255.255.0gateway192.?.?.?#修改DNSvim/etc/systemd/resolved.conf或vi/etc/resolv.confnameserver192.?.?......
  • yaml to properties failed, reason: Parse yaml file content failed for namespace:
    背景springboot2.2.x升级到是springboot2.7.x,apollo-client也跟着升级到了2.0.1,配置中心使用.properties的应用启动正常,使用.yml报了上面的错误解决方案版本降级到1.33解决下面是ai回答的结果让我们尝试几个可能的解决方案:检查你的SpringBoot版本和SnakeYAML版......
  • Couldn't find a configuration setting named 'registry'
    1. 检查Yarn版本首先,检查你正在使用的Yarn版本。Yarn不同版本的配置方式有所不同,特别是从Yarn1.x升级到Yarn2.x(又称Berry)后,配置的方式发生了变化。可以使用以下命令来检查当前的Yarn版本:yarn--versionYarn1.x:如果你使用的是1.x版本,yarnconfigsetreg......
  • 【PyTorch】FutureWarning: You are using `torch.load` with `weights_only=False` (
    【PyTorch】FutureWarning:Youareusingtorch.loadwithweights_only=False(thecurrentdefault问题描述model.load_state_dict(torch.load(model_path))FutureWarning:Youareusing`torch.load`with`weights_only=False`(thecurrentdefaultvalue),......
  • 搭建企业NextCloud并集成ONLYOFFICE
    部署安装1.1离线安装​ 使用能够安全拉取nextcloud镜像的服务器拉取镜像并打包成tar.gz通过sftp传输到准备好的部署服务器,这里使用的版本为aliyun镜像源拉去的latest版本如下[root@VM-12-10-centos~]#dockerimageinspectnextcloud:latest|grep-iversion"Dock......
  • hadoop启动hdfs时namenode消失
    解决HDFS无法启动namenode,报错PrematureEOFfrominputStream;FailedtoloadFSImagefile,seeerror(s)aboveformoreinfo 一.情况描述启动hadoop后发现无法打开hdfsweb界面,50070打不开,于是jps发现少了一个namenode: 查看日志信息,发现如下报错:2022-01-0323:54:......
  • virtualbox下host-only模型网络宿主机与虚拟机ping不通解决方法
    环境介绍:宿主机:centos虚拟机:在virtualbox里安装的win7Ping不通的原因:宿主机(host)ping不通虚拟机(guest):一般是虚拟机里的windows系统防火墙没有关闭导致的虚拟机(guest)ping不通宿主机(host):检查“默认网关”是否与virtualbox里设置的host-only的地址一致,一般是192.168.56......
  • 关于QFramework UIKit和ResKit生成的UI预制体打包后报错Failed to Create Res. Not Fi
     使用UIKit创建UIPrefb后打包发布后提示FailedtoCreateRes.NotFindByResSearchKeys:AssetName:basepanelBundleName:TypeName:UnityEngine.GameObject,找不到所需资源。下方如图1-1的报错。图1-1问题原因:一开始以为是没有按照教程所说的流程来创建。按照教程所说......
  • NSSCTF--Crypto--[强网拟态 2021]ONLYRSA
    [强网拟态2021]ONLYRSAtask:#!/usr/bin/envpythonfromCrypto.Util.numberimport*fromsecretimportflagn=26404882749642724802127738380102718019527577636691582886501036245400639490651939944149656100666825203142973550246517425052569869697312942219340516......
  • [term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]"
    这个报错是因为查询的语法有问题,我是在es的kibana上测试的语法如下图 因为filter中的term跟range是平级的所以我直接写到了同一个{}中了,其实两个应该是分开的不应该写一起对比下大家就能明白正确格式:"filter":[{"term":{"brand":"小米"}},{"range":{"price":{"gte":......