intsimulate(const string& pre,const string& last){ for(int length =1; length != pre.length();++length){ if(length >= last.length())return0; int i =int(pre.length()- length); for(int k =0; k != length;++k){ if(pre[i + k]!= last[k])goto hear; } returnint(last.length()- length); hear:; } return0; }
// 连接一个新的字符串 // 参数: // pre - 当前列表末尾的字符串下标 // plus - 要连接的新的字符串的下标 // 返回值:增长的长度 intlink(int pre,int plus){ staticint cache[20][20]{}; int& flag = cache[pre][plus]; if(flag ==0) flag =simulate(input[pre], input[plus])+1; return flag -1; }
// 参数: // length - 当前长度 // pre - 末尾字符串的下标 // 返回值:最大长度 intdfs(int length,int pre){ int result = length; for(int i =0; i != n;++i){ if(linked[i]!=2){ int value =link(pre, i); if(value ==0)continue; ++linked[i]; result =max(result,dfs(length + value, i)); --linked[i]; } } return result; }
intmain(){ cin >> n; for(int i =0; i != n;++i) cin >> input[i]; getchar(); int start =getchar(); int result =0; for(int i =0; i != n;++i){ if(input[i][0]== start){ ++linked[i]; result =max(result,dfs(int(input[i].length()), i)); --linked[i]; } } printf("%d\n", result); return0; }