首页 > 其他分享 >洛谷 P1127 词链——题解

洛谷 P1127 词链——题解

时间:2024-08-10 10:49:38浏览次数:6  
标签:洛谷 int 题解 gopher dog 单词 Downarrow 词链

洛谷P1127题解


传送锚点


摸鱼环节

词链

题目描述

如果单词 \(X\) 的末字母与单词 \(Y\) 的首字母相同,则 \(X\) 与 \(Y\) 可以相连成 \(X.Y\)。(注意:\(X\)、\(Y\) 之间是英文的句号 .)。例如,单词 dog 与单词 gopher,则 doggopher 可以相连成 dog.gopher

另外还有一些例子:

  • dog.gopher
  • gopher.rat
  • rat.tiger
  • aloha.aloha
  • arachnid.dog

连接成的词可以与其他单词相连,组成更长的词链,例如:

aloha.arachnid.dog.gopher.rat.tiger

注意到,. 两边的字母一定是相同的。

现在给你一些单词,请你找到字典序最小的词链,使得每个单词在词链中出现且仅出现一次。注意,相同的单词若出现了 \(k\) 次就需要输出 \(k\) 次。

输入格式

第一行是一个正整数 \(n\)(\(1 \le n \le 1000\)),代表单词数量。

接下来共有 \(n\) 行,每行是一个由 \(1\) 到 \(20\) 个小写字母组成的单词。

输出格式

只有一行,表示组成字典序最小的词链,若不存在则只输出三个星号 ***

样例 #1

样例输入 #1

6
aloha
arachnid
dog
gopher
rat
tiger

样例输出 #1

aloha.arachnid.dog.gopher.rat.tiger

提示

  • 对于 \(40\%\) 的数据,有 \(n \leq 10\);
  • 对于 \(100\%\) 的数据,有 \(n \leq 1000\)。

最爱水题解的我又来蟹题解了,这道词链题生动形象的为我们展现了蓝水题的强度,于是这道图论题就被我们干掉了。


正片开始

观察到数据范围很小,说明能给暴力的空间比较充裕,但纯暴力肯定会挂。


1.考虑暴力

暴力的话,直接建立邻接表,将字符串\(a[i]\)数组进行排序后枚举每个点暴搜一下,这里展示搜索代码。

code:

void dfs(int u,string s,int cnt)//u当前遍历点的标号,s为答案,cnt为加入字符串的数量
{
    if(cnt==n)//递归出口
    {
        s[s.length()-1]=' ';
        cout<<s;
        exit(0);
    }
    for(auto v:g[u])//遍历邻接表
    {
        if(vis[v]==0)
        {
            vis[v]=1;
            dfs(v,s+a[v]+'.',cnt+1);
            vis[v]=0;
        }
    }
}

2.优化部分

我们从样例中可以发现,对于一条合法的答案,其一定为欧拉通路或欧拉回路。

一个点如果能作为起点,那其在字符串首出现次数一定比在字符串尾出现的次数多一,这样就可以对枚举起点处进行优化。

同时需特判回路的特殊情况。

code:

for(int i=1;i<=n;i++)
{
    in[a[i][0]]++;
    out[a[i][a[i].length()-1]]++;
}//统计每个字母作为首或尾出现的次数
for(int i=1;i<=n;i++)
{
    if(in[a[i][0]]==out[a[i][0]]+1)//满足条件才进入答案处理
    {
        vis[i]=1;
        dfs(i,a[i]+'.',1);
        vis[i]=0;
    }
}
vis[1]=1;
dfs(1,a[1]+'.',1);//特判欧拉回路
vis[1]=0;
cout<<"***"<<endl;//无解

完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+10;
int n,vis[N],in[N],out[N];
string a[N];
vector<int>g[N];
void dfs(int u,string s,int cnt)
{
    if(cnt==n)
    {
        s[s.length()-1]=' ';
        cout<<s;
        exit(0);
    }
    for(auto v:g[u])
    {
        if(vis[v]==0)
        {
            vis[v]=1;
            dfs(v,s+a[v]+'.',cnt+1);
            vis[v]=0;
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        in[a[i][0]]++;
        out[a[i][a[i].length()-1]]++;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j&&a[i][a[i].length()-1]==a[j][0]) g[i].push_back(j);
    for(int i=1;i<=n;i++)
    {
        if(in[a[i][0]]==out[a[i][0]]+1)
        {
            vis[i]=1;
            dfs(i,a[i]+'.',1);
            vis[i]=0;
        }
    }
    vis[1]=1;
    dfs(1,a[1]+'.',1);
    vis[1]=0;
    cout<<"***"<<endl;
    return 0;
}

完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

标签:洛谷,int,题解,gopher,dog,单词,Downarrow,词链
From: https://www.cnblogs.com/qc0817/p/18352038

相关文章

  • CF1155C 题解
    题目传送门题目大意:给定一个长度为\(n\)的单增序列\(a\)和一个长度为\(m\)的序列\(b\),询问是否存在一个正整数\(y\)使得\(a_1\equiva_2\equiv\cdots\equiva_n\equivy\space(\bmod\spacep)\),且\(p\)在序列\(b\)中出现过。思路:将条件转化一下,得:是否存在一个......
  • 08-08 题解
    08-08题解地址A-CF1420Eluogu翻译更正ifhegivesnomorethatkorders对于至多k次操作,题面没有翻译出来思路怎么算贡献?贡献(被保护)出现在「处在任意两个不同的0的连续段的守卫」之间,而处于同一连续段的守卫之间没有贡献设一共\(cnt\)个\(0\),每个连续......
  • 提高组:玩具谜题 题解
    题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:这时singer告诉小南一个谜题:“眼镜藏在我左数第 33 个玩具小人的右数第 11 个玩具小人的左数第......
  • 08-09 题解
    08-09题解A小水题思路假设我们选定了当前子序列的绝对众数\(x\),那么该序列里最多再放\(num_x-1\)个其他数字为了分出最少的子序列,肯定要让每个子序列在拥有绝对众数的同时能消化尽量多的其他数字由此,可以得到一个贪心策略:每次取出出现次数最多的一个数字,消掉出现......
  • P1725 琪露诺 题解
    思路动态规划,单调队列动态规划观察题目,发现下标为\(i\)的点只能对\([i+l,i+r]\)区间的点产生贡献。设\(f_i\)为到达点\(i\)时的最大冻结指数。易得状态转移方程式:\(f_k\leftarrow\max(f_k,f_i+a_k),(k\in[i+l,i+r])\)。若直接对该方程进行转移,时间复......
  • 洛谷 P2731 骑马修栅栏 Riding the Fences之欧拉路径板子
    洛谷P2731题解传送锚点摸鱼环节[USACO3.3]骑马修栅栏RidingtheFences题目背景FarmerJohn每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。题目描述John是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。John的农场上......
  • AT_abc208_d 题解
    题目传送门做完这道题后感觉对Floyd的理解更深了。根据题面要求,设\(f(k,i,j)\)表示从\(i\)到\(j\)的所有只经过\(1\simk\)的点的所有路径的最短距离。很明显\(k\)那一维是阶段,因为它描述了从\(i\)到\(j\)路径中的不同点,而我们就是根据这一条件来划分集合,这......
  • CF908D New Year and Arbitrary Arrangement 题解
    Description给定\(k,pa,pb\),有一初始为空的序列。每次有\(\dfrac{pa}{pa+pb}\)的概率往序列后面加一个a。每次有\(\dfrac{pb}{pa+pb}\)的概率往序列后面加一个b。当出现大于等于\(k\)个形如ab的子序列(a和b不一定相邻)时停止。求序列最终的ab子序列期望数。So......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......