思路:
不难发现文件可以解压,当且仅当 1 号点出发能到达的节点集合,是一个有向无环图(DAG)。
无法解压的情况,就是图里存在环。于是我们可以 dfs
解压到这个文本时,给其标记 vis[i] = true
,解压完毕vis[i] = false
。
递归解压它引用到的文本,如果中途发现引用的节点 vis
为 true
说明出现了环(本质上同,无向图找环)。
实时维护一个 string ans
用于存储已经解压的内容,一旦发现其长度超过 1e6
则直接返回,否则最后输出 ans
即可。
代码:
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
#define pq priority_queue
using namespace std;
typedef pair<int,int> pii;
int n, len[10], tot;
char s[10][2000010], ans[10000100];
bool vis[10];void dfs(int num){vis[num] = true;for(int i = 1;i <= len[num];i ++){if(s[num][i] == '*'){i ++;if(!vis[s[num][i] - '0']){dfs(s[num][i] - '0');}else{cout << "#\n";exit(0);}}else{ans[++ tot] = s[num][i];}}if(tot > 1e6){cout << "#\n";exit(0);}vis[num] = false;
}void solve(){scanf("%lld", &n);for(int i = 1;i <= n;i ++){scanf("\n%c", &s[i][1]);int j = 1;while(s[i][j] != '#')scanf("%c",&s[i][++j]);len[i] = j - 1;}dfs(1);printf(ans + 1);
}signed main()
{
// ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;while(t--){solve();}return 0;
}