[关闭]
@xiaoziyao 2021-01-23T05:23:39.000000Z 字数 883 阅读 768

CF1383A String Transformation 1解题报告

解题报告


CF1383A String Transformation 1解题报告:

更好的阅读体验

题意

分析

比较好玩的一道题。

首先特判掉存在的情况,这样明显不合法。

我们考虑每个字符都进行一次操作(从改成),然后考虑怎么减少操作。

我们把一次字符变为字符的操作看成一条的有向边,因为所有的边都满足,所以这个图一定是一个DAG。

我们发现如果存在,那么实际上是没有必要的(直接借助就好了)。

那么我们保留任意一颗生成树都是合法的,具体用一个并查集实现就可以了。

代码

  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. const int maxk=27;
  5. int T,n,ans,flg;
  6. int f[maxk];
  7. string a,b;
  8. int find(int x){
  9. return f[x]==x? x:f[x]=find(f[x]);
  10. }
  11. void merge(int x,int y){
  12. x=find(x),y=find(y);
  13. if(x!=y)
  14. f[x]=y,ans++;
  15. }
  16. int main(){
  17. scanf("%d",&T);
  18. while(T--){
  19. ans=flg=0;
  20. for(int i=1;i<=26;i++)
  21. f[i]=i;
  22. scanf("%d",&n);
  23. cin>>a>>b;
  24. for(int i=0;i<n;i++){
  25. if(a[i]>b[i]){
  26. flg=1;
  27. break;
  28. }
  29. merge(a[i]-96,b[i]-96);
  30. }
  31. if(flg==0)
  32. printf("%d\n",ans);
  33. else puts("-1");
  34. }
  35. return 0;
  36. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注