洛谷 P1019 [NOIP2000 提高组] 单词接龙 题解

暴搜!! 暴搜!! 暴搜!!

重要的事情说三遍
#include <bits/stdc++.h>
using namespace std;
const int N = 25;
int n, ans, use[N];
string s, word[N];
void dfs(string s){
    int ls = s.size(); //s的length
    ans = max(ans, ls); //求出最长的单词接龙
    for(int i = 0; i < n; i++){
        string w = word[i];
        int lw = w.size();
        for(int j = 1; j < ls && j < lw; j++){ 
            if(use[i] < 2 && s.substr(ls - j) == w.substr(0, j)){ //如果一个字符串后缀与另一个字符串的前缀一样,并使用次数不超过2次
                use[i]++;//增加这个单词的使用次数
                dfs(s + w.substr(j));
                use[i]--;//恢复现场
                break; //跳出
            }
        }
    }
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i++) cin >> word[i];
    cin >> s;
    s = " " + s; //加随意一个字符,这样不用特判 
    dfs(s);
    cout << ans - 1; //输出最长的单词接龙,要减去空格的1
}
posted @ 2024-08-08 14:37  wayneoi  阅读(8)  评论(0编辑  收藏  举报