P1019 单词接龙

Posted doubest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1019 单词接龙相关的知识,希望对你有一定的参考价值。

这个题最烦的地方就是题意有点点含糊

首先是“另外相邻的两部分不能存在包含关系”这句话的理解,这句话的最准确翻译就是  两个字符串接龙之后 不能等于其中任何一个字符串

其次就是两个字符串接龙时,如果有多种接法,使用最长那一种

AC代码如下:

#include <bits/stdc++.h>

using namespace std;
int const N = 25;
string stringBox[N];
int useNum[N];
string startBox[N];
int startIndex[N];

int maxLen = -1;

bool baohan(string a,string b){
    if(a == b){
        return false;
    }
    int len = a.size();
    string sub = b.substr(0,len);
    return sub == a;
}



string fusion(string a,string b){
    int len = a.size();
    for(int i=len-1;i>=0;i--){
        string sub = a.substr(i,len-i);
        if(sub == b.substr(0,len-i)){
            string res = a.substr(0,i) + b;
//            cout << res  << endl;
            return res;
        }
    }
    string ini = "#";
    return ini;
}


void dfs(string s,int n){
    int flag = 0;
    for(int i=1;i<=n;i++){
        if(useNum[i] != 2){
            flag = 1;
        }
    }
    if(flag){
        for(int i=1;i<=n;i++){
            if(useNum[i] == 2) {
                continue;
            }
            bool b = baohan(s,stringBox[i]);
            if(b){
                continue;
            }

            string fuse = fusion(s,stringBox[i]);
            int len = fuse.size();
            if(fuse != "#"){
                useNum[i]++;
                if(len > maxLen){
                    maxLen = len;
                }
                dfs(fuse,n);
                useNum[i]--;
            }
        }

    }
    return;
}



int main()
{
    int n = 0;
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> stringBox[i];
    }
    char start;
    cin >> start;

    int index = 0;
    for(int i=1;i<=n;i++){
        if(stringBox[i][0] == start){
            startBox[index] = stringBox[i];
            startIndex[index] = i;
            index++;
            int len = stringBox[i].size();
            if(len > maxLen){
                maxLen = len;
            }
        }
    }


    for(int i=0;i<index;i++){
        memset(useNum,0,sizeof(useNum));
        useNum[startIndex[i]]++;
        dfs(startBox[i],n);
    }

    cout << maxLen << endl;

    return 0;
}

 

以上是关于P1019 单词接龙的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1019 单词接龙

洛谷 P1019 单词接龙

P1019 单词接龙

P1019 单词接龙

洛谷P1019单词接龙 搜索

洛谷 P1019 单词接龙 深搜