社区讨论
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 条回复,欢迎继续交流。
正在加载回复...