样例没过,玄关
查看原帖
样例没过,玄关
1421656
little_q_exist楼主2025/1/6 09:33
#include<iostream>
#include<cstring>
using namespace std;
int n,ans = 0,sum = 0;
string str[25];
char c;
int vis[25],repeat[25][25];
int link(int x,int y) // 判断两个字符串是否可以相连 
{
	for (int k = str[x].size() - 1;k>=0;k--)
	{
		bool match = 1;
		for (int i = k,j = 0;i<=min(str[x].size() - 1,str[y].size() - 1);i++,j++)
		{
			if (str[x][i] != str[y][j])
			{
				match = 0;
				break;
			}
		}
		if (match && k != 0 && str[x].size() - k != str[y].size()) // 如果可以连且不包含 
		{
			return str[x].size() - k;
		}
	}
	return 0;
}
void search(int index)
{
	bool ending = 1;
	for (int i = 1;i<=n;i++)
	{
		if (link(index,i) && vis[i] < 2) //能相连而且使用没有超过两次 
		{
			ending = 0;
			vis[i] ++;
			repeat[index][i] = link(index,i);
			ans += str[i].size() - repeat[index][i];
			search(i);
			ans -= str[i].size() - repeat[index][i];// 回溯 
			vis[i] --;
		}
	}
	if (ending == 1)
	{
		sum = max(sum,ans);
		return;
	}
}

int main(){
	cin>>n;
	for (int i = 1;i<=n;i++)
	{
		cin>>str[i];
	}
	cin>>c;
	for (int i = 1;i<=n;i++)
	{
		if (str[i][0] == c)
		{
			vis[i] ++;
			ans = str[i].size();
			search(i);
			vis[i] = 0;
		}
	}
	cout<<sum<<endl;
	return 0;
}

样例输出33,求助大佬

2025/1/6 09:33
加载中...