题目连接:http://codevs.cn/problem/1018/
思路:其实就是一道深搜的题 不过很难写因为都是字母 需要用到很多函数
下面看代码:代码中给了许多注释
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include<string.h> using namespace std; int n,con[21][21],visited[21],ans;//visit用来计算每个单词用的次数的 con用来记算重合部分的长度 char dict [21][110],st; //用来记录每个单词 void lenn(int a,int b) //这个函数是用来看重合部分的 { con[a][b] = 0; int min1 = strlen(dict[a]) < strlen(dict[b])?strlen(dict[a]):strlen(dict[b]); int w = strlen(dict[a]); int y = w - min1; for(int temp = 1;temp < min1;temp++) { if(strncmp(dict[a] + y + temp,dict[b],min1 - temp) == 0)//这个函数的作用是看看两个部分是否相同如果相同的话就返回了0 { con[a][b] = min1 - temp; } } return; } void dfs(int a,int len)// 这个是深搜函数 { int flag = 1; for(int i = 1;i <= n;i++) { if(con[a][i]&&visited[i] < 2) { visited[i]++; dfs(i,len + strlen(dict[i]) - con[a][i]); //这个长度是要变化的 visited[i]--; flag = 0; } } if(flag) { if(len > ans) ans = len; } } int main() { scanf("%d",&n); for(int i = 1;i <= n;i++) { scanf("%s\n",dict[i]); } scanf ("%c",&st); for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { lenn(i,j); } } for (int i=1;i<=n;i++) { if (dict[i][0]==st) { memset(visited,0,sizeof(visited)); visited[i]++; dfs(i,strlen(dict[i])); } } printf("%d\n",ans); return 0; }
时间: 2024-10-24 00:16:43