首页 > 其他分享 >CodeForces - 510C Fox And Names

CodeForces - 510C Fox And Names

时间:2023-01-10 00:00:13浏览次数:62  
标签:std const int 510C s1 Fox CodeForces s2

CodeForces - 510C Fox And Names

题解:建图+拓扑排序

首先题目想让你按照给定的字符串修改字母表的字母序,我们很容易想到拓扑排序,但是这怎么建图?实际上对于两个输入的字符串,s1,s2,s1在s2的上面,如果他们某个位置的字符不相同,那么我们需要建一条从s1[i]-->s2[i]的边,当然题目中只有26个点,因为是小写字母,这样就实现了建边;我们再来考虑什么样的情况会出现不可能,首先是图上有环,其次如果s1字符串在s2的上面,但是lens1>lens2,并且他们相同长度的字符一模一样这样肯定不能实现字母序,

例如s1:aaaaa

​ s2:aaaa

#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10;
int n;
string s[110];
vector<int> g[30];
int du[30];
queue<int> q;
vector<int> ans;
int main(void)
{
    Zeoy;
    int t = 1;
    // cin >> t;
    while (t--)
    {
        cin >> n;
        for (int i = 1; i <= n; ++i)
            cin >> s[i];
        int flag = 1;
        for (int i = 1; i <= n - 1; ++i)
        {
            int ischange = 0;
            int len1 = s[i].length();
            int len2 = s[i + 1].length();
            for (int j = 0; j < min(len1, len2); ++j)
            {
                if (s[i][j] != s[i + 1][j])
                {
                    ischange = 1;
                    g[s[i][j] - 'a' + 1].push_back(s[i + 1][j] - 'a' + 1);
                    du[s[i + 1][j] - 'a' + 1]++;
                    break;
                }
            }
            if (!ischange && len1 > len2)			
            {
                cout << "Impossible\n";
                return 0;
            }
        }
        for (int i = 1; i <= 26; ++i)
        {
            if (du[i] == 0)
                q.push(i);
        }
        int num = 0;
        while (q.size())
        {
            int t = q.front();
            ans.push_back(t);
            num++;
            q.pop();
            for (auto i : g[t])
            {
                du[i]--;
                if (du[i] == 0)
                    q.push(i);
            }
        }
        if (num < 26)
            cout << "Impossible\n";
        else
        {
            for (auto i : ans)
            {
                cout << (char)(i + 'a' - 1);
            }
            cout << endl;
        }
    }
    return 0;
}

标签:std,const,int,510C,s1,Fox,CodeForces,s2
From: https://www.cnblogs.com/Zeoy-kkk/p/17038917.html

相关文章

  • Educational Codeforces Round 141 (Rated for Div. 2) Different Arrays
    Problem-D-Codeforces题意:给一个长度为n的数组a,下标从2到n-1,每个位置执行一次操作操作:设操作位置为i,$a_{i-1}+=a_i,a_{i+1}-=a_i$,或者$a_{i-1}-=a_i,a_......
  • Educational Codeforces Round 141 (Rated for Div. 2) A-E
    比赛链接A题意给一个数组\(a\),要求重排列以后\(a[i]\neqa[1,i-1]\),其中\(a[1,i-1]\)是前\(i-1\)项和。如果无解则输出NO;否则,给出一个合法的重排列后的\(a......
  • 「Codeforces」寒假训练 2023 #3
    A.StringLCM原题链接#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e5+10;intq;strings,t;intlens,lent;int_lcm;......
  • Codeforces Round #266 (Div. 2) C. Number of Ways (dp)
    https://codeforces.com/contest/466/problem/C题目大意:数组a由n个整数组成a[1],a[2],...,a[n]。计算将数组中的所有元素分成三个连续部分的方法,以使每个部分中的元素总和......
  • Educational Codeforces Round 141 (Rated for Div. 2) A-C题解
    比赛链接A、MakeitBeautiful一种构造方法:按照从大到小的顺序构造,可以发现前缀和永远大于当前值。但是需要特判存在两个最大值的情况。只需要将最小值与第二位交换位置......
  • Codeforces Round #646 (Div. 2) D交互
    A.OddSelection题意:给定n个数,是否能选k个数和为奇数分析:和为奇数只有一种情况:n个偶数+k个奇数(n任意,k为奇数)枚举奇数个数即可voidsolve(){a=b=......
  • Codeforces Round #842 (Div. 2)(B,D,E)
    CodeforcesRound#842(Div.2)(B,D,E)B题实在是没想到BB这个题大意是给你一个乱序的一到n的数,我们每次可以选择k个数,放到这个数组的最后面,问我们需要最少多少个操作可以......
  • Educational Codeforces Round 141
    A.MakeitBeautiful他想要变美,我们按照题目说的做就行,通过判断我们发现如果在sort一遍后sort(a+1,a+1+n);if(a[1]==a[n]){cout<<"NO"<<"\n";......
  • B. Kolya and Tandem Repeat -- codeforces
    B.KolyaandTandemRepeathttps://codeforces.com/problemset/problem/443/B 思路如果补充字符长度k大于等于s长度,则新的字符串,一份两半,前半分包括s,可能包括部分补......
  • Codeforces 1671 F Permutation Counting 题解
    题目链接把\(p_i>p_{i+1}\)的位置个数称为间隔数首先想到一个暴力做法。从小到大挨个添加1-n中的每个数,注意到添加数i时,只能添加到当前序列的最后11个位置中,否则逆序对数......