首页 > 其他分享 >CF510C Fox And Names 题解

CF510C Fox And Names 题解

时间:2024-02-29 11:56:25浏览次数:22  
标签:int 题解 Fox ++ CF510C ans MAXN include

CF510C Fox And Names 题解

https://www.luogu.com.cn/problem/CF510C

思路

  • 题意就是:确定一个小写字母的比较规则,使得给定的所有字符串在一开始就是按你确定的比较规则排序了的。
  • 可以发现:对于前后一对字符串,找到第一对不同的字符,是要这两个字符有合法的大小关系,就能满足题意。
  • 由于很显然:一个字母有多个字母在要比它小或者大。
  • 所以:建图 —> 拓扑排序 —> 模拟。

如何判断 Impossible

  • 分一下几种情况:
\(s_i\) \(s_{i + 1}\)
hh hh
hh hhb
hhb hh
  • 第一种情况题目的输入已经帮我们解决了:所有字符串两两不同。
  • 剩下的分类特判即可。

Code

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <map>
  
using namespace std;

const int MAXN = 100 + 10;

int n;
int ans[MAXN], len_ans = 0;
int b[MAXN], top = 0;
int cen[MAXN], pre[50];
int s[MAXN][MAXN];
string SSS;
vector<int> c[50];

int main(){
  cin >> n;
  for(int i = 1; i <= n; i++){
    cin >> SSS;
    for(int j = 0; j < SSS.size(); j++){
      s[i][j] = int(SSS[j] - 'a' + 1);
    }
  }
  for(int i = 1; i < n; i++){
    for(int j = 0; j < 100; j++){
      if(s[i][j] == 0 || s[i + 1][j] == 0){
        if(s[i][j] != 0 && s[i + 1][j] == 0){
          cout << "Impossible";
          return 0;
        }
        break;
      }
      if(s[i][j] != s[i + 1][j]){
        c[s[i][j]].push_back(s[i + 1][j]);
        pre[s[i + 1][j]]++;
        break;
      }
    }
  }
  for(int i = 1; i <= 26; i++){
    if(pre[i] == 0){
      b[++top] = i;
    }
  }
  while(top > 0){
    int i = b[top];
    top--;
    for(int j : c[i]){
      if(pre[j] > 0){
        pre[j]--;
        if(pre[j] == 0){
          b[++top] = j;
        }
      }
    }
    ans[++len_ans] = i;
  }
  if(len_ans != 26){
    cout << "Impossible";
    return 0;
  }
  for(int i = 1; i <= len_ans; i++){
    cout << char(ans[i] + 'a' - 1);
  }
  return 0;
}

标签:int,题解,Fox,++,CF510C,ans,MAXN,include
From: https://www.cnblogs.com/huangqixuan/p/18043179

相关文章

  • CF383C Propagating tree 题解
    题目链接:CF或者洛谷比较朴素的题,注意到这个涉及到子树变化,我们考虑优先处理出\(dfs\)序,方便处理。注意到第一个问题较为繁琐,我们着重解决下第一个问题。在树上问题,我们这种间隔点常常使用\(deep\)进行区分。根的\(deep\)为奇数,那么对自己子树范围内的奇数\(deep\)......
  • P2487 [SDOI2011] 拦截导弹 题解
    题目链接:拦截导弹约定:本题中提到的\(LDS\)和\(LIS\)不是严格单调,而是非严格单调,即为\(\le或者\ge\)。比较神奇的题,问的东西比较多,我们逐渐拆分:对于第一个问题而言,这个dp方程是很好写的:\[dp[i]=\max{dp[j]}+1(i<j,h[i]\leh[j],v[i]\lev[j])\]其中\(dp[i]\)即......
  • 题解 gym102900J 【Octasection】
    代码:#include<iostream>#include<algorithm>#include<stack>#include<vector>#include<cstdio>usingnamespacestd;typedefstructRectangle_tag{ intx1; intx2; inty1; inty2; Rectangle_tag(intx1_,intx2_,int......
  • 24冬网络流复习题解
    A是谁瞪了半个小时不会*2000呀,是谁呀是谁呀。感觉这题比部分紫题都难。。。首先发现选取字符的顺序并不重要,所以\(t\)可以看成\(26\)个字符要选的个数。设字符\(c\)出现了\(x\)次,那么直接向汇点连流量为\(x\)费用为\(0\)的边。然后考虑\(s_i\)与每个字符的关......
  • 2024年2月28号题解
    P4994终于结束的起点解题思路通过加法同余原理可以知道f[i]%m==0,那么f[i-1]%m=1,所有把f[i+1]%m=1转换成了f[i-1]%m=1的问题那么只需要填好斐波那契数列再判断就可以了,又因为斐波那契可能会超出int的范围那么我们对每一项斐波那契再取模就可以了代码......
  • 旅游景点 Tourist Attractions (壮压 DP)题解
    简化题意题目链接——不卡内存班题目链接——卡内存版给定\(n\)个点和\(m\)条边组成的无向图,按照一定限制要求停留\(2\simk+1\)共\(k\)个点(可以经过但不停留),求最短的从\(1\)出发到\(n\)的路径长。限制情况如下:共有\(q\)个限制,接下来\(q\)行,每行两个数\(x......
  • CF1408H Rainbow Triples 题解
    Description给定长度为\(n\)的序列\(p\)找出尽可能多的三元组\((a_i,b_i,c_i)\)满足:\(1\lea_i<b_i<c_i\len\)\(p_{a_i}=p_{c_i}=0\),\(p_{b_i}\ne0\)\(p_{b_i}\)互不相同。所有的\(a_i,b_i,c_i\)互不相同。输出最多可以选出多少个三元组,多组数据。\(\sumn\le......
  • P10160 [DTCPC 2024] Ultra 题解
    【题目描述】给你一个\(01\)序列,你可以进行如下操作若干次(或零次):将序列中形如\(101\cdots01\)的一个子串(即\(1(01)^k\),\(k\ge1\))替换成等长的\(010\cdots10\)(即\(0(10)^k\))。你要操作使得\(1\)的个数尽可能少,输出最少的\(1\)的个数。【思路】一开始看到这道题......
  • 数据类型拓展与面试题解读
    整数拓展进制:在平时咱们生活中经常见到的例如通用于电脑识别的二进制、咱们生活中常用的十进制、工作中常见的八进制与十六进制。二进制:通常会以0b开头十进制:咱们生活中的数字八进制:通常以0开头十六进制:通常以0x开头​ 浮点数拓展(float、double)试题举例银行......
  • Codeforces Round 929 (Div. 3) 题解(D-G)
    比赛链接:https://codeforces.com/contest/1933官解暂未放出。质量不错的一场D3。CF1933D.TurtleTenacity:ContinualMods题意将数组\(a_{1..n}\ge1\)重排,问是否能使\(((a_1\mathbin{\rmmod}a_2)\mathbin{\rmmod}a_3)\cdots\mathbin{\rmmod}a_n\ne0\)......