【DFS】CODE[VS] 1018&&NOIP2000提高组T3 单词接龙 (日常刷题???)

来源:互联网 发布:淘宝粮仓被挤爆了 编辑:程序博客网 时间:2024/04/29 12:14

点击进入异世界


一个深搜,莫名其妙卡了3天….
一开始想到直接匹配字符串会不会太慢,于是就想到了用string自带的find()函数寻找子串位置,两个相比较的字符串位置相减,如果等于零(相互抵消)则说明可以合并,然后递归调用,每次ans取len的max

然后死活调不出来,换了char数组用strstr()还是调试不出来,后来看到了外校神犇blog

Candy?神犇的博客原文地址:http://www.cnblogs.com/candy99/p/5782167.html

又看了看数据范围(n<=20)….,直接比较好了,每次调用让“龙串”的尾与当前匹配到的字符串的首相比较,这个 l-swc>0?l-swc:0 三目条件运算指的是如果当前龙串比最长字符串的长度还要大的话,就从出超的那一位开始枚举否则从零开始,可能能够优化一些吧,博客作者说“直接从l-mx开始,要不然一定会覆盖”,个人感觉覆盖了也没事233,==。


others:
1.我觉得题目既然让求最大龙串的长度,那么我们完全可以不用管是否覆盖,每次取max就可以了
2.一个dfs,让我学会了find,substr,strstr,strcpy,strcmp等等字符串函数的用法,值了2333
3.辣鸡智障题目,不推荐做(口胡)


代码如下(前排%神犇):

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <string>using namespace std;int n;int ans,swc;//orz swc rp++int viv[60];//orz viv rp++string st[60];bool pd(string e,int bf,int j){    for(int i = bf;i < e.size();i++)    {        if(e[i] != st[j][i-bf])        {            return false;        }    }return true;}inline void dfs(string e){    int l = e.size();    ans = max(ans,l);    for(int i = 0;i < l;i++)    {        for(int j = 1;j <= n;j++)        {            if(viv[j] >= 2)                continue;            if(st[j].size() <= l-i)                continue;            if(!pd(e,i,j))                continue;            viv[j]++;            dfs(e+st[j].substr(l-i,st[j].size()-l+i));            viv[j]--;        }    }}int main(){    scanf("%d",&n);    for(int i = 1;i <= n;i++)    {        cin>>st[i];        //cout<<st[i]<<endl;        if(st[i].size() > swc)        {            swc = st[i].size();        }    }    cin>>st[0];    //cout<<st[0]<<endl;    dfs(st[0]);    printf("%d\n",ans);return 0;}

THE END

By Peacefuldoge

http://blog.csdn.net/loi_peacefuldog

1 0