Skip to main content
  1. Posts/

codeforces 501 B. Obtaining the String

·1 min
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

题目链接:http://codeforces.com/contest/1015/problem/B

题意: 给出字符串s和字符串t,问一个将s变为t的策略。 可以做的变换为,交换s中相邻的字符串,该操作最多不能超过4000次,字符串长度最大为50.

思路:

首先可以确定,当两个字符串的组成相同时(也就是有同样的字符组成,只是位置可能有所不同)一定有解。

考虑最坏情况,每个字符都要交换到最远的地方,总的操作数<50*50<4000,因此一定有解。

判断组成是否相同可以用multiset

 1/* ***********************************************
 2Author :111qqz
 3mail: renkuanze@sensetime.com
 4Created Time :2018年10月03日 星期三 16时11分29秒
 5File Name :b.cpp
 6************************************************ */
 7#include <bits/stdc++.h>
 8#define ms(a,x) memset(a,x,sizeof(a))
 9typedef long long LL;
10#define pi pair < int ,int >
11#define MP make_pair
12using namespace std;
13const double eps = 1E-8;
14const int dx4[4]={1,0,0,-1};
15const int dy4[4]={0,-1,1,0};
16const int inf = 0x3f3f3f3f;
17int n;
18string s,t;
19multiset<char>A,B;
20int main()
21{
22        #ifndef  ONLINE_JUDGE
23        freopen("./in.txt","r",stdin);
24  #endif
25  cin>>n;
26  cin>>s>>t;
27  for ( auto x : s) A.insert(x);
28  for (auto x: t) B.insert(x);
29  if (A!=B)
30  {
31    puts("-1");
32    return 0;
33  }
34  vector<int>ans;
35  //可以保证处理过的一定相等
36  for ( int i = 0 ; i < n ; i++)
37  {
38    if (s[i]==t[i]) continue;
39    string sub_str = s.substr(i,50);
40    // cout<<"sub_str:"<<sub_str<<endl;
41    int pos = sub_str.find(t[i])+i;
42    //  cout<<"pos:"<<pos<<endl;
43    for ( int j = pos; j  >= i+1 ; j-- )
44    {
45      ans.push_back(j);
46      swap(s[j-1],s[j]);
47      //  cout<<s<<endl;
48    }
49  }
50  cout<<ans.size()<<endl;
51  for ( auto x : ans) cout<<x<<" ";
52
53  #ifndef ONLINE_JUDGE
54  fclose(stdin);
55  #endif
56    return 0;
57}

Related

2017 ACM-ICPC Beijing Regional 总结

·3 mins
emmm 最后一场,果然还是写点什么记录一下吧。 DAY 0 # 到宾馆已经晚上八点了,惊讶得发现宾馆和15年来参加regional的是同一个,于是戳了下当时和我们一起来的@Always队的三个已经毕业的学长,求了波rp2333

poj 1949 Chores (拓扑排序+dp)

·1 min
http://poj.org/problem?id=1949 # 题意: # 有n个任务,第i个任务需要时间xi来完成,并且第i个任务必须在它 “前面的” 某些任务完成之后才能开始。

vimrc for ACM-ICPC (赛场用)

·1 min
弄了点比较短的,赛场上用的配置文件orz 1map <F5> :call Co()<CR> 2func! Co() 3 exec "w" 4 exec "!g++ % -std=gnu++11 -Wall -o %<" 5 exec "! ./%<" 6 7endfunc 8syntax on 9set nu 10 11autocmd BufNewFile *.cpp exec ":call SetTitle()" 12func SetTitle() 13 let l = 0 14 let l = l + 1 | call setline(l,'#include <bits/stdc++.h>') 15 let l = l + 1 | call setline(l,'using namespace std;') 16 let l = l + 1 | call setline(l,'const int inf = 0x3f3f3f3f;') 17 let l = l + 1 | call setline(l,'#define ms(a,x) memset(a,x,sizeof(a))') 18 let l = l + 1 | call setline(l,'typedef long long LL;') 19 let l = l + 1 | call setline(l,'int main()') 20 let l = l + 1 | call setline(l,'{') 21 let l = l + 1 | call setline(l,' return 0;') 22 let l = l + 1 | call setline(l,'}') 23endfunc 故地重游,rp++

2016 NEERC Northern Subregional Contest A Anniversary Cake (水题)

·1 min
题意: # W_H的方格纸,共有(w+1)_(H+1)个整点,现在将2个蜡烛放在2个不同的整点上。蜡烛不会被放在边界上。现在给出方格纸的尺寸和2个蜡烛的坐标,求一条线段将方格纸拆成2部分,而且这条线段不经过任何一个蜡烛且使得每一部分恰好有一个蜡烛。问线段的起点和终点。