记录编号 |
222904 |
评测结果 |
AAAAAAAAA |
题目名称 |
[NOIP 2000PJ]单词接龙 |
最终得分 |
100 |
用户昵称 |
Rapiz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.002 s |
提交时间 |
2016-02-05 16:09:46 |
内存使用 |
0.32 MiB |
显示代码纯文本
//luogu P1019 单词接龙(NOIP2000)
//#define LOCAL
#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
#define REP(a,b,c) for(int c=a;c<=b;c++)
using namespace std;
const int MAXN=20+5;
int len[MAXN][MAXN],ans,n;
string w[MAXN];
int p[MAXN];
char ch;
#define cin fin
#ifndef LOCAL
#define cout fout
#endif
ifstream fin("dcjl.in");
ofstream fout("dcjl.out");
void dfs(int idx,int cnt){
// cout<<w[idx]<<' '<<cnt<<endl;
for(int i=1;i<=n;i++) if(p[i]<2&&len[idx][i]!=0) {
p[i]++;
dfs(i,cnt+len[idx][i]);
p[i]--;
}
ans=max(ans,cnt);
// cout<<"\n";
}
int main(){
cin>>n;
REP(1,n,i) cin>>w[i];
REP(1,n,i) REP(1,n,j){
//if(i==j) continue;
int len1=w[i].size(),len2=w[j].size(),mlen=min(len1,len2);
for(int k=1;k<=mlen;k++) {
if(w[i].substr(len1-k)==w[j].substr(0,k)) {
if(k!=len1) len[i][j]=len2-k;
// printf("k:%d Compare w[%d].substr(%d) with w[%d].substr(0,%d): %s -- %s\n",k,i,len1-k,j,k,w[i].substr(len1-k).c_str(),w[j].substr(0,k).c_str());
// printf("len[%d][%d]=%d\n",i,j,len[i][j]);
break;
}
}
}
cin>>ch;
for(int i=1;i<=n;i++) {
if(w[i][0]!=ch) continue;
p[i]++;
dfs(i,w[i].size());
p[i]--;
}
//cout<<endl;
//printf("ANS:%d",ans);
cout<<ans;
}