首页 > 其他分享 >CF1383C String Transformation 2

CF1383C String Transformation 2

时间:2022-10-11 21:46:55浏览次数:91  
标签:原图 DAG String ... read void write CF1383C Transformation

link

Solution

已经被图论虐穿了。。。/kk

首先不难看出对于同一位置,可以用 s1 的字符往 s2 的字符连边,就成了一个大小为 \(20\) 的有向图。然后我们发现其实我们是要构建一个新图,每条边按时间顺序加入,使得原图中的 \(u\to v\) 这条边在新图中可达,且路径时间单调递增,然后让这个新图边数最小。

我们可以对于原图中一个弱连通分量进行单独考虑。注意到假如是 \(n\) 个点,DAG 点数大小最多是 \(m\),那么新图可以如下构造(借用的湘妹的图):

可以发现当且仅当 \(i>j\) 且 \(i,j\) 都在 DAG 中时不可达(需要考虑时间单增的问题),然而这个点对也并不需要考虑。然后你发现这样的话似乎最优性就很显然了。

问题现在就变为了如何找到图中最大的DAG,那么我们可以考虑往点集里面加点即可,每次加的点没有往当前集合的边即可。

Code

#include <bits/stdc++.h>
using namespace std;

#define Int register int
#define MAXN 100005

//char buf[1<<21],*p1=buf,*p2=buf;
//#define getchar() (p1==p2 && (p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
template <typename T> void read (T &x){char c = getchar ();x = 0;int f = 1;while (c < '0' || c > '9') f = (c == '-' ? -1 : 1),c = getchar ();while (c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar ();x *= f;}
template <typename T,typename ... Args> void read (T &x,Args& ... args){read (x),read (args...);}
template <typename T> void write (T x){if (x < 0) x = -x,putchar ('-');if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> void chkmax (T &a,T b){a = max (a,b);}

bool f[1 << 20];
int n,tim,to[25];
char s1[MAXN],s2[MAXN];

int fa[MAXN];
int findSet (int x){return fa[x] == x ? x : fa[x] = findSet (fa[x]);}

void Work (){
	read (n),scanf ("%s%s",s1 + 1,s2 + 1);
	for (Int i = 0;i < 20;++ i) fa[i] = i,to[i] = 0;
	for (Int i = 1;i <= n;++ i){
		int x = s1[i] - 'a',y = s2[i] - 'a';
		to[x] |= 1 << y,fa[findSet (x)] = findSet (y);
	}
	int ans = 40,mxv = 0;
	for (Int i = 0;i < 20;++ i) if (findSet (i) == i) ans --;
	memset (f,0,sizeof (f)),f[0] = 1;
	for (Int S = 0;S < (1 << 20);++ S) if (f[S]){
		chkmax (mxv,__builtin_popcount (S));
		for (Int i = 0;i < 20;++ i) if (!(S >> i & 1) && (to[i] & S) == 0) f[S | (1 << i)] = 1;
	}
	write (ans - mxv),putchar ('\n');
}

signed main(){
	read (tim);
	while (tim --> 0) Work ();
	return 0;
}

extra

可能纯粹是一些闲话吧,想写也只是因为过于滑稽。以前身边没有发生的时候并不认为或者并不感受深刻,现在滑稽感倒是很重了。

标签:原图,DAG,String,...,read,void,write,CF1383C,Transformation
From: https://www.cnblogs.com/Dark-Romance/p/16782678.html

相关文章

  • String
    1、String字符串字面值先在堆内存中字符串常量池中查找是否有相同的字符串如果有则不开辟空间如没有则新开辟空间newString()都会在堆内存中开辟空间2、StringB......
  • 常用类—Object,String
    一、Object类objetc是默认所有类的父类,很多时候类都有一些相同的需求,比如获取内存地址,判断是多例还是多例。Object常用方法——toString()和equals()1、toString方法to......
  • 23. JS String(字符串)对象
    1.前言JavaScriptString对象用于处理字符串,其中提供了大量操作字符串的方法,以及一些属性。创建String对象的语法格式如下:varval=newString(value);varval=......
  • MyBatis-plus 新增时List转String 查询时String转list
    MyBatis-plus新增时List转String查询时String转list1.需求说明项目为:SpringBoot+MyBatisPlus采用实体类接受参数,有一个参数为List,对应的数据库字段为nvachar,要求新......
  • js 字符串 截取字串 slice,substring,substr方法对比
    js字符串截取字串slice,substring,substr方法对比1.slice()方法slice()提取字符串的某个部分并在新字符串中返回被提取的部分。该方法设置两个参数:起始索引(开始位......
  • javascript parse date string - js 字符串转日期
    一、日期数字newDate().getTime()//1665370859678数字表示从UTC+0时区的1970年1月1日0时0分0秒开始的那一刻起,所经过的毫秒数。无论是在北京还是伦敦,此时此刻,无论......
  • Using a Robot to Print the Lexicographically Smallest String
    UsingaRobottoPrinttheLexicographicallySmallestStringYouaregivenastring s andarobotthatcurrentlyholdsanemptystring t .Applyoneofthe......
  • linux 下*** Install and enable the mbstring extension ***的解决方法
    安装php-mbstring即可执行:​​yuminstallphp-mbstring​​,然后重新启动apache即可ubuntu/debain、deepin下使用​​apt-getinstallphp-mbstring​​即可......
  • Java中StringBuffer的获取当前容量的方法capacity的用法
    我们都知道,java中字符串都是用String,内容和长度都是不可变的。如果想使用可变长度的,可以使用类StringBuffer该类的方法是安全的,可以保证线程安全   使用的过程中学......
  • string
    函数名称功能构造函数产生或复制字符串析构函数销毁字符串=,assign赋以新值Swap交换两个字符串的内容+=,append(),push_back()添加字符insert......