这一题其实不难,不过是思路比较难确定,想了蛮九的,不知道如何解决这种问题. 重点是,如果一个点是关键点,那么一定是满足两种情况.1 (1) 1 或者是 1 0 1 (1) 是(1) 1 0 1 这样暴力一下就出来了,而且有一个规律,如果这个点是转折点,那么一定可以缩到最近的点上.
不要怕,不要怂.向前冲.
| # | User | Rating |
|---|---|---|
| 1 | Benq | 3857 |
| 2 | jiangly | 3810 |
| 3 | maroonrk | 3534 |
| 4 | tourist | 3528 |
| 5 | Kevin114514 | 3510 |
| 6 | turmax | 3411 |
| 7 | Um_nik | 3387 |
| 8 | Radewoosh | 3367 |
| 9 | heuristica | 3322 |
| 10 | strapple | 3317 |
| # | User | Contrib. |
|---|---|---|
| 1 | Qingyu | 158 |
| 2 | maspy | 150 |
| 3 | Um_nik | 146 |
| 4 | Errichto | 139 |
| 5 | adamant | 136 |
| 6 | nik_exists | 135 |
| 7 | maroonrk | 134 |
| 8 | DNR | 133 |
| 9 | Dominater069 | 131 |
| 10 | AmShZ | 130 |
这一题其实不难,不过是思路比较难确定,想了蛮九的,不知道如何解决这种问题. 重点是,如果一个点是关键点,那么一定是满足两种情况.1 (1) 1 或者是 1 0 1 (1) 是(1) 1 0 1 这样暴力一下就出来了,而且有一个规律,如果这个点是转折点,那么一定可以缩到最近的点上.
不要怕,不要怂.向前冲.
坑爹,题意居然是这样的. 他是,给你一个DNA,这个DNA中每个字母只会出现一次,然后分解得到了很多的碎片,问还原原来的DNA碎片就可以,也就是出入会有一个保证,保证一定是ab , bs 之后,不会出现b了,因为如果出现了,那么原来的DNA就包含两个b,也就不是满足题目意思.这样的话,就直接DFS就可以了,一个一个来,每一个字母建一个点.连边就可以.
using namespace std; typedef long long LL; typedef pair<int, int> pii; const int MAXN = 2*1e5 + 1; const int pN = 1e6;// <= 10^7 const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; void add(LL &x, LL y) { x += y; x %= MOD; } vector next[30]; bool vis[30], mark[30]; string res = ""; int in[30]; void DFS(int u) { vis[u] = true; res += u + 'a'; for(int i = 0; i < next[u].size(); i++) { int v = next[u][i]; if(in[v] != 0 && vis[v] == false) { DFS(v); } } } int main() { int n; cin >> n; string a; for(int i = 0; i < n; i++) { cin >> a; for(int j = 0; j < a.size(); j++) { if(j != a.size() — 1) { next[a[j]-'a'].push_back(a[j+1]-'a'); in[a[j+1]-'a']++; } mark[a[j]-'a'] = true; } } for(int i = 0; i < 26; i++) { if(in[i] == 0 && mark[i]) { DFS(i); } } cout << res << endl; return 0; }
| Name |
|---|


