LEXSTR

news/2024/11/28 0:54:15/

题目链接:http://www.spoj.com/problems/LEXSTR/

题意是给一个字符串str,然后给出m个数对 i , j; 代表str[i] 和 str[j] 可以互相之间交换任意次 ,然后问如何交换使得这个字符串的字典序最小,输出这个字典序最小的字符串。

字符串长度是1e5.

一开始我这样想:如给两个数对(i,j)、(i,k),那么j和k也是可以交换的,但是稍微看一下就知道复杂度是不够的,后来再看一下发现,其实把i、j、k都拿出来并按字典序排一下序就可以了。也就是说对于一个数对(i,j)中的 i ,跟i有直接或者间接关系的,都可以直接拿出来按字典序排个序。

找直接关系间接关系这里很耳熟啊,是啊,用并查集就可以完成了;

对这些数对做一些并查集,然后可以分成几个部分,对每个部分我们按照字典序对字符串排序,就好了;

#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<time.h>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<iostream>
using namespace std;
#define  LONG long long
const int   INF=0x3f3f3f3f;
const int MOD=1e9+7;
const double PI=acos(-1.0);
#define clrI(x) memset(x,-1,sizeof(x))
#define clr0(x) memset(x,0,sizeof x)
#define clr1(x) memset(x,INF,sizeof x)
#define clr2(x) memset(x,-INF,sizeof x)
#define EPS 1e-10
int num[100100][2];
char str[100100];
int f[100100];
int findset(int x )
{if(f[x] == x)return x;else return f[x] = findset(f[x]);
}
char tmp [100100];
int tmpp[100100];
int main()
{int T;cin>>T;while(T--){scanf("%s",str);int len = strlen(str);int m ;cin>>m;for(int i = 0; i <= len +10; ++ i)f[i] = i;for(int i = 1; i<=m ; ++ i){int q , p;scanf("%d%d",&p,&q);if(p > q) swap(q , p);int r1 = findset(p) ;int r2 = findset(q) ;f[r1] = r2;f[p] = r2;f[q] = r2 ;}for(int i = 0 ; i <len ;++ i)f[i] = findset(i) ;vector <int > vec[len + 3];for(int i = 0 ; i < len ; ++ i) vec[i].clear();for(int i = 0 ; i < len ;++ i){vec[f[i]].push_back(i);}for(int i = 0 ; i< len ;++ i){int k = 0;for(int j = 0 ; j <vec[i].size() ; ++ j ){int t = vec[i][j];tmp[++k] = str[t];tmpp[k] = t;}sort(tmp + 1 , tmp +k + 1 );sort(tmpp + 1 ,tmpp + k + 1);for(int j = 1 ; j <= k ; ++ j)str[tmpp[j]] = tmp[j];}for(int i = 0 ; i < len ; ++ i) vec[i].clear();printf("%s\n",str);}
}



http://www.ppmy.cn/news/239803.html

相关文章

CS61B - Lec 21 - Binary Search Tree

Lec 21 - BST Binary Search Trees概念查找插入删除 从Lec20开始&#xff0c;就转战CS61B Spring 2019了&#xff0c;18后面全变成公开课了。 本章主要讲的是Binary Search Tree&#xff0c;是一种非常流行的数据结构&#xff0c;据说各大面试中都会出现。其中用到了超多的recu…

Lex正则表达式

字符 解释 . 匹配除换行符("/n")以外的任何单个字符 * 匹配前面表达式的零个或多个拷贝 [] 匹配括号中的任意的字符类 ^ 作为正则表达式的第一个字符匹配行的开头 $ 作为正则表达式的最后一个字符匹配行的结尾 {} …

lex yacc

http://www.linuxdiyf.com/viewarticle.php?id91568 作者&#xff1a;绚丽也尘埃 最近看《GCC-the-Complete-Reference-fly》才知道有lex和yacc这两个有趣的工具&#xff0c;并且fedora core 8也默认安装有这两个工具&#xff0c;所以趁此机会学习一下&#xff0c;以前学编译…

lex与yacc之lex符号表示例

在lex初探篇中&#xff0c;每次要定义新的单词&#xff0c;都需要重新编译&#xff0c;这是非常麻烦的。但是如果在词法分析程序运行时能够构建一个单词表&#xff0c;那么就可以在 添加新的单词时不用修改和重新编译lex程序。symboltable.l%{/** Word recognizer with a symbo…

linux下lex词法分析器,Lex词法分析器

LEX/FLEX词法分析器 CONTENTS: [TOC] 这篇文章的内容包括: lex语法格式 linux下flex的安装和使用 flex实例 flex源代码的编译和使用 Lex/Flex词法分析器 Lex是LEXical compiler的缩写,是Unix环境下非常著名的工具,主要功能是生成一个词法分析器(scanner)的C源码,描述规则采用…

flex RSL

RSL(Runtime shared libraries)即动态链接库&#xff0c;在程序运行时由FlashPlayer动态加载。静态链接库是SWC文件&#xff0c;通过编译器的library-path和include-libraries编译进应用程序。采用静态链接的应用程序SWF会产生比较大的文件以及更长的下载时间。使用RSL的应用程…

用Flex写的RIA应用网站开张了(http://www.2ren.cn)

偶做的flex网站终于可以拿出来献丑了&#xff01;本来不想用csdn的blog发文章了的。高兴嘛就再发一篇&#xff01; 前端用flex&#xff0c;后台使用java&#xff0c;并结合spring、hibernate等。 欢迎大家访问我的RIA网站http://www.2ren.cn

lex 正则表达式

规则&#xff1a; . 匹配任何单个字符&#xff0c;除\n. - 表示匹配范围&#xff0c;如&#xff1a;a-z&#xff0c;表示匹配a-z之间的任何字符 * 匹配前面表达式的零个或多个拷贝。 [] 匹配括号内的任意字符的字符类&#xff0c;第一个符号是"^"&#xff0c;表示…