社区讨论

67pts求条

P1019[NOIP 2000 提高组] 单词接龙(疑似错题)参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhizo8js
此快照首次捕获于
2025/11/03 18:20
4 个月前
此快照最后确认于
2025/11/03 18:20
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define code return
#define _end 0
//make default source.
using namespace std;
struct node
{
	int a,b;
};
bool cmp(node x,node y)
{
	return x.b<y.b;
}
int n;
vector<string> words;
vector<int> len;
int sum[20][20];
char st;
int maxl;
vector<unordered_map<ull, int>> memo;

int solve(const string&a,const string&b)
{
    int maxk=min((int)a.size()-1,(int)b.size()-1);
    for(int k=maxk;k>=1;--k)
	{
        if(a.substr(a.size()-k,k)==b.substr(0,k))
		{
            return k;
        }
    }
    return 0;
}
void dfs(int last,int currl,vector<int>&cnt,ull mask)
{
    if(currl>maxl)
	{
		maxl=currl;
	}
    if(memo[last].count(mask)&&memo[last][mask]>currl)
	{
        return;
    }
    memo[last][mask]=currl;
    int rem=0;
    for(int i=0;i<n;++i)
	{
		rem+=len[i]*(2-cnt[i]);
	}
    if(currl+rem<=maxl)
	{
		return;
	}
    for(int j=0;j<n;++j)
	{
        if(cnt[j]>=2)
		{
			continue;
		}
        if(sum[last][j]==0)
		{
			continue;
		}
        cnt[j]++;
        ull newmask=mask-((cnt[j]-1)<<(2*j))+(cnt[j]<<(2*j));
        dfs(j,currl+len[j]-sum[last][j],cnt,newmask);
        cnt[j]--;
    }
}
signed main(void)
{
	cin>>n;
    words.resize(n);
    len.resize(n);
    for(int i=0;i<n;++i)
	{
        cin>>words[i];
        len[i]=words[i].size();
    }
    cin>>st;
    for(int i=0;i<n;++i)
	{
        for(int j=0;j<n;++j)
		{
            sum[i][j]=solve(words[i],words[j]);
        }
    }
    maxl=0;
    memo.resize(n);
    vector<int> cnt(n,0);
    for(int i=0;i<n;++i)
	{
        if(words[i][0]==st)
		{
            cnt[i]=1;
            ull mask=1LL<<(2*i);
            dfs(i,len[i],cnt,mask);
            cnt[i]=0;
            memo[i].clear();
        }
    }
    cout<<maxl;
	code _end;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...