首页 > 其他分享 >【补题记录】 Codeforces Round 797 (Div. 3) F Shifting String(置换环)

【补题记录】 Codeforces Round 797 (Div. 3) F Shifting String(置换环)

时间:2023-07-05 22:56:15浏览次数:43  
标签:797 String int back vector 补题 push now nows

Codeforces Round 797 (Div. 3) F Shifting String

思路:

根据这个排列进行替换的操作可以往置换环考虑,就是对于每一段字串,它的变换都是有规律的,经过一定的操作之后都会回到原点,可以想象转化成图上问题。

参考ygg的题解,直接用链表模拟这个转化的过程,然后暴力计数,因为要满足所有点都回到对应原位,所以求所有满足条件的长度之后求lcm即可

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
const int N = 200+10,mod = 1e9+7;

int p[N];
bool v[N];
vector<int> c;
void dfs(int x){//找到完整的一个环并且存在vector c中
	if(v[x])return;
	v[x] = 1;
	c.push_back(x);
	dfs(p[x]);
}
void solve() {
	int n;
	string s;
	cin >> n >> s;
	s = " " + s;
	for(int i = 1; i <= n; i ++) cin >> p[i],v[i] = 0;
	int res = 1;
	for(int i = 1; i <= n; i ++){
		if(!v[i]){
			c.clear();
			dfs(i);
			list<char> pres,nows;
//			for(int j = i; v[j]; v[j] = 1, j = p[j])
//				pres.push_back(s[j]);
			for(auto id: c) pres.push_back(s[id]);
			nows = pres;
			nows.push_back(nows.front());//把头结点移动到尾部,就是模拟这个环上的点移动的过程
			nows.pop_front();
			int t = 1;
			while(pres != nows){
				nows.push_back(nows.front());
				nows.pop_front();
				t ++;//不断重复上述操作然后计数
			}
			res = res * t /__gcd(res,t);
		}
	}
	
	cout << res <<'\n';

}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _t = 1;
	cin >> _t;
	while(_t --)
		solve();
	
	return 0;
}

Educational Codeforces Round 4, E Square Root of Permutation

参考ygg的题解,补充注释

代码

#include<bits/stdc++.h>
//#define int long long
using namespace std;
typedef pair<int,int> pii;
const int N = 1e6+10,mod = 1e9+7;


int ans[N],p[N],vis[N],n;
vector<int> c;
vector<vector<int>> cyc[N]; //cyc[i]存的是大小为i的每个环 每个环用一个vector来存
void update(vector<int> x){//把环还原成排列
	for(int i = 1; i < x.size(); i++){
		ans[x[i-1]] = x[i];
	}
	ans[x.back()] = x[0];
}
void dfs(int u){
	if(vis[u]) return;
	vis[u] = 1;
	c.push_back(u);
	dfs(p[u]);
}

void solve() {
	cin >> n;
	for(int i = 1; i <= n; i ++) ans[i] = i,cin >> p[i];
	for(int i = 1; i <= n;i ++){
		if(!vis[i]){
			c.clear();
			dfs(i);//把排列拆成各种大小的环
			cyc[c.size()].push_back(c);
		}
	}
	for(int sz = 1; sz <= n; sz ++){
		if(sz%2 == 0 && cyc[sz].size() % 2 == 1){
			cout << "-1\n";
			return;
		}
	}
	for(int sz = 1; sz <= n; sz ++){
		if(sz%2 == 1){
			for(auto c: cyc[sz]){//遍历大小为奇数的环
				vector<int> now(c.size());
				int id = 0;
				for(auto it: c){
					now[id % c.size()] = it;
					id+=2;
				}
				update(now);
			}
		} else {//遍历大小为偶数的环
			for(int i = 0; i < cyc[sz].size(); i += 2){
				vector<int> c1 = cyc[sz][i],c2 = cyc[sz][i+1];//每次c1,c2代表合成一对的环
				vector<int> now;//now存合成的环,交替放入now中
				for(int i = 0; i < c1.size(); i ++){
					now.push_back(c1[i]);
					now.push_back(c2[i]);
				}
				update(now);
			}
		}
	}
	
	for(int i = 1; i <= n ;i ++) cout << ans[i] << " ";
	cout <<'\n';
	
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int _t = 1;
	//cin >> _t;
	while(_t --)
		solve();
	
	return 0;
}

Codeforces Round 789 (Div. 2) E Tokitsukaze and Two Colorful Tapes

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
const int N = 1e5+10,mod = 1e9+7;

int a[N],b[N],to[N];
bool v[N];
vector<int> c;

void dfs(int x){
	if(v[x]) return;
	v[x] = 1;
	c.push_back(x);
	dfs(to[x]);
}
void solve() {
	int n;
	cin >> n;
	for(int i = 1; i<= n;i ++) v[i] = 0;
	int mi = 1,mx = n;
	for(int i = 1; i<= n; i ++) cin >> a[i];
	for(int i = 1; i <= n; i ++) cin >> b[i],to[a[i]] = b[i];
	int ans = 0;
	
	auto cal=[&](){
		if(c.size() == 1) return 0ll;
		vector<int> v;
		for(int i = 0; i < c.size() - c.size() % 2; i ++){
			if(i%2 == 0) v.push_back(mx--);
			else v.push_back(mi ++);
		}
		int res = 0;
//		for(auto i:v){
//			cout << i <<" ";
//		}
//		cout << '\n';
		for(int i = 1; i < v.size(); i ++) {
			res += abs(v[i] - v[i - 1]);
		}
		res += abs(v.back() - v[0]);
		return res;
	};
	
	for(int i = 1; i <= n;i ++){
		if(!v[i]){
			c.clear();
			dfs(i);
			int k = cal();
			//cout << k << "\n";
			ans += k;
		}
	}
	
	cout << ans <<'\n';
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int _t = 1;
	cin >> _t;
	while(_t --)
		solve();
	
	return 0;
}

标签:797,String,int,back,vector,补题,push,now,nows
From: https://www.cnblogs.com/neko-yingying/p/17530530.html

相关文章

  • SPOJ Substrings 题解
    \(\text{SAM}\)入门好题。首先我们需要知道几个关于\(\text{SAM}\)的结论。结论1:题目中的\(f(x)\)单调下降。显然,对于长度为\(x\)的子串,其必存在一个\(x-1\)的后缀,这个后缀的\(\text{endpos}\)集合肯定包含子串的\(\text{endpos}\)集合,所以必有\(f(x-1)\le......
  • 60.C++中新增了string,它与C语言中的 char *有什么区别吗?它是如何实现的?
    60.C++中新增了string,它与C语言中的char*有什么区别吗?它是如何实现的?1.实现方式:string是一种抽象类,它的实现由std::string和char*转换而来。在实现上,std::string内部通常会使用动态数组来存储字符串,可以动态地分配内存。同时,std::string还可能使用一些优化技术,如内部缓存和......
  • 重写JSON.stringify与JSON.parse使其支持解析function类型
    constJSONStringify=(option)=>{returnJSON.stringify(option,(key,val)=>{//处理函数丢失问题if(typeofval==='function'){return`${val}`;}//处理undefined丢失问......
  • VC中BSTR、Char和CString类型的转换(太牛了)
    [分享]Vc中BSTR,char和CString的转换1、char*转换成CString若将char*转换成CString,除了直接赋值外,还可使用CString::format进行。例如:charchArray[]="Thisisatest";char*p="Thisisatest";或LPSTRp="Thisisatest";或在已定义Unicode应的用程序中TCHAR......
  • 数据库问题之“字符编码问题 Cause: java.sql.SQLException: Incorrect string value:
     1)表1和表2的产品名称[数据库字段]字符编译方式不一致①问题 org.springframework.jdbc.UncategorizedSQLException:Errorupdatingdatabase.Cause:java.sql.SQLException:Incorrectstringvalue:'\xF0\x9F\x8E\x81\xE7\x88...'forcolumn'product_name'atr......
  • [问题记录] C# string.format null值变量值需要显示在占位符
    起因是在C#程序里执行存储过程,恰好参数值里有NULL值变量,可是null值没有填充到占位符上。网上一看,好多都是添加参数的方法(command.Parameters.Add(),DBNull.value)去解决这个问题,实在不想搞的这么麻烦,我就只想简单点。 比如string.Format(@"EXECXXX{0},{1},{2}",parameter......
  • byte转string再转回为有损过程
    privateclassHostRemoveResponseModifierimplementsModifier{protectedStringgetHost(){returnurl;}@Overridepublicbyte[]mod(byte[]origin){StringstrString=newString(origin);Stringtarget=getHost()+&quo......
  • convert string list to number list
    #stringwithintegerssepatedbyspacesstring1="12345678"print("ActualStringcontainingintegers:",string1)print("Typeofstring:",type(string1))#convertingthestringintolistofstringslist1=list(string1.s......
  • 有向无环图-dfs-797所有可能的路径
    给你一个有n个节点的有向无环图(DAG),请你找出所有从节点0到节点n-1的路径并输出(不要求按特定顺序)graph[i]是一个从节点i可以访问的所有节点的列表(即从节点i到节点graph[i][j]存在一条有向边)。示例1:输入:graph=[[1,2],[3],[3],[]]输出:[[0,1,3],[0,2,3]]解释:有两......
  • Java杂记————object.getClass()和object.class以及Java中的toString()方法的的区别
    不说废话,直接上干货:(注意大小写:object为对象,Object为类)1,object.getClass()它是Object类的实例方法,返回一个对象运行时的类的Class对象,换句话说,它返回的是对象具体类型的类对象。2,Object.class这是java语言的一种语法糖,用来返回一个对象所属类的Class对象(这里补充一下:Class类,......