• 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;
    }
  • 相关阅读:
    linux/unix下 pid文件作用浅析
    gunicorn启动django时静态文件的加载
    分享30道Redis面试题,面试官能问到的我都找到了
    python利用mongodb上传图片数据 : GridFS 与 bson两种方式
    GridFS大文件的添加、获取、查看、删除
    你真的懂redis吗?
    mongoDB的复制集5----复制集安全(认证,用户,权限)
    MongoDB复制集安全认证
    MongoDB 用户名密码登录
    MongoDB 分片
  • 原文地址:https://www.cnblogs.com/doubest/p/12002713.html
Copyright © 2020-2023  润新知