Блог пользователя 2742195759

Автор 2742195759, история, 10 лет назад, По-английски

这一题其实不难,不过是思路比较难确定,想了蛮九的,不知道如何解决这种问题. 重点是,如果一个点是关键点,那么一定是满足两种情况.1 (1) 1 或者是 1 0 1 (1) 是(1) 1 0 1 这样暴力一下就出来了,而且有一个规律,如果这个点是转折点,那么一定可以缩到最近的点上.

不要怕,不要怂.向前冲.

Полный текст и комментарии »

  • Проголосовать: нравится
  • -19
  • Проголосовать: не нравится

Автор 2742195759, история, 10 лет назад, По-английски

坑爹,题意居然是这样的. 他是,给你一个DNA,这个DNA中每个字母只会出现一次,然后分解得到了很多的碎片,问还原原来的DNA碎片就可以,也就是出入会有一个保证,保证一定是ab , bs 之后,不会出现b了,因为如果出现了,那么原来的DNA就包含两个b,也就不是满足题目意思.这样的话,就直接DFS就可以了,一个一个来,每一个字母建一个点.连边就可以.

include

include

include

include

include

include

include

include

include

include

define PI acos(-1.0)

define CLR(a, b) memset(a, (b), sizeof(a))

define fi first

define se second

define ll o<<1

define rr o<<1|1

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; }

Полный текст и комментарии »

  • Проголосовать: нравится
  • -17
  • Проголосовать: не нравится