33分代码求助
查看原帖
33分代码求助
476720
_pharos_C楼主2023/2/9 13:49
#include<bits/stdc++.h>
using namespace std;
int n, vis[2500], ans, rem[25][25];
string str[25];

int findl(string a, string b) {
	int a1 = a.size(), b1 = b.size();
	for(int i=1;i<=min(a1, b1);i++) {
		if(a.substr(a1 - i, i) == b.substr(0, i))
			return i;
	}
	return 0;
}

void dfs(int x, int len) {
	cout << x <<' '<< len << endl;
	ans = max(ans, len);
	for(int i=1;i<=n;i++) {
		if(vis[i] == 2 or rem[x][i] == 0) 
			continue;
		vis[i]++;
		dfs(i, len + str[i].size() - rem[i][x]);
		vis[i]--;
	}
}

int main() 
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	cin >> n;
	for(int i=1;i<=n;i++) 
		cin >> str[i];
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {
		int tmp = findl(str[i], str[j]);
		rem[i][j] = tmp;
	}
    char ch;
    cin >> ch;
    for(int i=1;i<=n;i++) {
    	if(str[i][0] == ch) {
    		vis[i]++;
    		dfs(i, str[i].size());
    		vis[i]--;
		}
	}
	cout << ans << endl;
	return 0;
}

findl找最小重叠长度,不重叠返回0

2023/2/9 13:49
加载中...