已AC, 最后两个测试点太慢求助大佬哪里可以优化?
查看原帖
已AC, 最后两个测试点太慢求助大佬哪里可以优化?
925190
_DANCER_楼主2023/2/11 12:04

用的dfs, AC了, 后两个点用了260+ms, 前面几个测试点时间都很正常, 最后两个太慢了, 是不是因为有冗余的执行步骤, 求指教.

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int n;char start;
int ans;string now;
string box[44];//每个字符串, 储存了两次, 因此开了40
bool use[44];//是否用过

bool whetherlink(string a,string b)//b follows a;
{
    int la=a.length(),lb=b.length();
    bool q=0;int i;
    for(i=la-1;i>=1;i--)
        if(b.find(a.substr(i,la-i))==0)
            {q=1;break;}
    //如果全相等不认为包含, 题意应该是这样
    if(la!=lb&&b.find(a)==0) q=0;
    if(la!=lb&&la>=lb&&a.substr(la-lb,lb)==b)
        q=0;
    return q;
}

string linkword(string a,string b)
{   
    int la=a.length(),lb=b.length();
    for(int i=la-1;i>=1;i--)  
        if(b.find(a.substr(i,la-i))==0)
            return a.substr(0,i)+b;//返回链接后的string
}

void dfs(int x)//搜索第x位置;x>=2
{
    if(x>2*n)
    {
        ans=max(ans,(int)now.length());
        return;
    }
    for(int k=0;k<=1;k++)
    {
        if(k)
        for(int i=1;i<=2*n;i++)
        {   
            if(use[i]==0&&whetherlink(now,box[i]))
            {   
                string tmp=now;//储存链接之前的字符串
                use[i]=1;//占位
                now=linkword(now,box[i]);
                dfs(x+1);//搜索下一位
                use[i]=0;//取消占位
                now=tmp;//恢复链接前的字符串
            }
        }
        else dfs(x+1);//这一位不要直接搜下一位
    }
}


int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        cin>>box[i];
        box[i+n]=box[i];
    }
    cin>>start;
    for(int i=1;i<=n;i++)
    {
        if(box[i][0]==start)
        {
            now=box[i];
            use[i]=1;
            dfs(2);
            use[i]=0;
        }
    }
    cout<<ans;
    return 0;
}
2023/2/11 12:04
加载中...