zoukankan      html  css  js  c++  java
  • P1019 单词接龙

    https://www.luogu.org/problemnew/show/P1019

    题目描述

    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

    输入输出格式

    输入格式:

    输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

    输出格式:

    只需输出以此字母开头的最长的“龙”的长度

    输入输出样例

    输入样例#1: 
    5
    at
    touch
    cheat
    choose
    tact
    a
    
    输出样例#1:
    23
    

    说明

    (连成的“龙”为atoucheatactactouchoose)

    NOIp2000提高组第三题

    主要是需要检查能不能连接 然后dfs维护最大单词长度就好 注意如果接口长度等于单词长度 等于没连接 所以一定要先判断是不是temp=now 

    #include<bits/stdc++.h>
    
    using namespace std;
    #define MAXN 1000
    
    string word[MAXN],st;
    int used[MAXN];
    int n,sum=0;
    
    bool chk (string s,string e,int k)
    {
        int len =s.length();
        for(int i=0; i<k; i++)
        {
            if(s[len-k+i]!=e[i])
                return false;
        }
        return true;
    }
    
    void add (string &s,string e,int k)
    {
        int len=e.length();
        for(int i=k; i<len; i++)
        {
            s+=e[i];
        }
    }
    
    void dfs(string now)
    {
        int l=now.length();
        sum=max(sum,l);
        for(int i=0; i<n; i++)
        {
            if(used[i]>=2)
                continue;
            int mk=word[i].length();
            for(int j=1; j<=mk; j++)
            {
                if(chk(now,word[i],j))
                {
                    string temp=now;       //需要复制一个临时串试一试能不能更新单词长度
                    add(temp,word[i],j);
                    if(now==temp)           //长度没变化 放弃
                        continue;
                    used[i]++;
                    dfs(temp);
                    used[i]--;
                }
            }
    
        }
    }
    
    int main()
    {
        cin>>n;
        for(int i=0; i<n; i++)
            cin>>word[i];
            cin>>st;
            memset(used,0,sizeof(used));
            dfs(st);
            cout<<sum<<endl;
            return 0;
        }
    View Code
  • 相关阅读:
    linux抓包命令tcpdump
    Linux ssh配置详解
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
    Python装饰器详解
    centos7 安装redis
    C# 操作Exchange 的powershell以实现邮件撤回
    C# 委托的理解和案例
    IIS10 http重定向https
    程序员修炼之道 | 不要让你的代码走上渡渡鸟的灭绝之路
    离子烫攻略
  • 原文地址:https://www.cnblogs.com/youchandaisuki/p/8529949.html
Copyright © 2011-2022 走看看