Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- set <int> st;
- vector <int> v[30];
- vector < pair <int, int> > topsort;
- vector <char> ans;
- string s[109];
- int visit[30], visit2[30];
- void dfs(int val, int cnt)
- {
- for(int i = 0; i < v[val].size(); i++) {
- dfs(v[val][i], cnt + 1);
- }
- //visit[val] = max(visit[val], cnt);
- topsort.push_back(make_pair(cnt, val));
- }
- void dfs2(int val) {
- int cnt = 0;
- for(int i = 0; i < v[val].size(); i++) {
- dfs2(v[val][i]);
- }
- st.insert(val);
- }
- int main()
- {
- ll t;
- cin >> t;
- while(t--) {
- //memset(visit, 0, sizeof(visit));
- memset(visit2, 0, sizeof(visit2));
- ll n;
- scanf("%lld", &n);
- for(int i = 0; i < n; i++)
- cin >> s[i];
- for(int i = 0; i < n - 1; i++) {
- ll len = min(s[i].length(), s[i + 1].length());
- for(int j = 0; j < len; j++) {
- if(s[i][j] == s[i + 1][j])
- continue;
- else {
- v[ s[i][j] - 'a' ].push_back(s[i + 1][j] - 'a');
- break;
- }
- }
- }
- int cnt = 0, start;
- for(int i = 0; i <= 26; i++) {
- if(v[i].size() == 0)
- continue;
- dfs2(i);
- int tmp = st.size();
- if(cnt < tmp ) {
- cnt = tmp;
- start = i;
- }
- st.clear();
- }
- dfs(start, 1);
- sort(topsort.begin(), topsort.end());
- for(int i = topsort.size() - 1; i >= 0; i--) {
- if( visit2[topsort[i].second])
- continue;
- visit2[topsort[i].second] = 1;
- ans.push_back(topsort[i].second + 'a');
- }
- for(int i = ans.size() - 1; i >= 0; i--) {
- printf("%c", ans[i]);
- if(i != 0)
- printf(" ");
- else
- printf("\n");
- }
- for(int i = 0; i <= 28; i++) {
- v[i].clear();
- }
- topsort.clear();
- ans.clear();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement