信息学奥赛一本通 1220:单词接龙 洛谷 P1019
不服老不行,这题我写得用心(不过只有60分),被尚贤秒杀。
要100分AC答案 请看尚贤的答案 https://blog.csdn.net/weixin_42790071/article/details/105601560
这里我提供我的过不了的数据
输入数据:
2
abababab
abababc
a
输出
19
check函数错了,要重写.
#include<bits/stdc++.h>
using namespace std;
int ans; //最大值
int n;
int v[25]; //使用过多少次
string a[25];
/****************************************************
函数 int check(string a接头的字符, string b结尾的字符)
判断两个字符是否可以相连接,如果可以输出连接长度,如果不相连输出0
a="bast" b="astonish" return 3
****************************************************/
/*
//main()的单步测试
//自己做测试数据
// basast astonish
// bast ast
// bast cast
// bast asc
// bbast astc
// as ast
string a,b;
cin>>a>>b;
cout<<check(a,b);
*/
int check(string a,string b ){
int la = a.size();
int lb = b.size();
int len=0; // 连接的长度
// a="bast" b="astonish"
if(la==1&&b[0]==a[0]){
return lb;
}
bool break_i = false;
for(int i=1;i<la;i++){
//如果有一个字符相等,则算它们下面的是否相等
if(a[i]==b[0]){
len++;
// 找剩余的 (b)ast 与 astonish 对比
// bast ab 和 bast astces
int k;
for(k=1; k<=la-i && lb>k ;k++){
if(a[i+k]==b[k]&&a[i+k]!='\0'){ //如果不加 a[i+k]!='\0' 会把string最后一个\0都一起统计
len++;
}else{
//如果有不相等的,就跳出
//如果跳出时候,第一个字符不是结尾,则不能对接,改len=0
if( (i+k)!=la ) {
len=0;
}else{
//已经找到结尾和头对应的,跳出上次a的循环
break_i = true;
}
break;
}
}
//跳出整个循环
if(break_i){
break;
}
}
}
//cout<<len<<endl;
// 如果包含的数字全部是一个数的,则这两个数完全包含 如:bast 接 ast
if( len>=la||len>=lb){
return 0;
}
return len;
}
/*
dfs主要函数, x 是目前首字符, sum是当前连接字符数
*/
void dfs(string x,int sum ){
ans = max(ans,sum); //更新最大值
cout<<ans<<"##";
for(int i=0;i<n;i++){
if(v[i]>1){
continue;
}
else{
int jielong = check(x,a[i]); //接合的字符长度
if(jielong!=0&&x!=a[i]){
v[i]++;
// a="bast"(这个已经在上次的时候算了) b="astonish" add = 3
// 从上得出传入参数为 lb - add + ans
cout<<x<<"@"<<a[i]<<" \n";
if((a[i].length() - jielong)==0){
dfs( a[i], ( jielong ) );
}else{
dfs( a[i], ( a[i].length() - jielong + sum) );
}
v[i]--; //回溯
}
}
}
return;
}
int main(){
freopen("cpp.in","r",stdin);
freopen("cpp.out","w",stdout);
// string a,b;
// cin>>a>>b;
// cout<<check(a,b);
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>a[n];
dfs(a[n],0 );
cout<<ans<<endl;
return 0;
}