BZOJ1330 : Editing a Book

注意到答案不超过$5$,因此可以考虑BFS求出距离起始态或者终止态不超过$2$的所有状态。

设它们到起始态、终止态的距离分别为$f[S],g[S]$,则$ans=\min(5,f[S]+g[S])$。

时间复杂度$O(n^6\log(n!))$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const int N=12,M=363000;
int n,i,j,k,a[N],len[N],S,x,z,v[M],g[M],h,t,q[M],ans;ll f[N][M];
inline ll encode(){
  ll t=0;
  for(int i=0;i<n;i++)t=t<<4|a[i];
  return t;
}
inline int getid(ll x){
  int l=0,r=len[n]-1;
  while(l<=r){
    int mid=(l+r)>>1;
    if(f[n][mid]==x)return mid;
    if(f[n][mid]<x)l=mid+1;else r=mid-1;
  }
}
inline void ext(int x){
  if(~v[x])return;
  v[q[++t]=x]=z;
}
int main(){
  for(n=2;n<=9;n++){
    for(i=0;i<n;i++)a[i]=i;
    do{f[n][len[n]++]=encode();}while(next_permutation(a,a+n));
    sort(f[n],f[n]+len[n]);
  }
  while(~scanf("%d",&n)){
    if(!n)return 0;
    for(i=0;i<n;i++)scanf("%d",&a[i]),a[i]--;
    if(n==1){puts("0");continue;}
    S=getid(encode());
    h=1,t=0;
    for(i=0;i<len[n];i++)v[i]=-1;
    z=0;
    ext(S);
    while(h<=t){
      z=v[x=q[h++]]+1;
      if(z>2)continue;
      ll O=f[n][x];
      for(i=1;i<n;i++)for(j=i;j<n;j++){
        ll U=(1ULL<<((j-i+2)*4))-1,F=O;
        int L=(j-i+1)*4;
        for(k=4*(i-1);k>=0;k-=4){
          ll A=(F>>k)&U;
          F^=(A^((A>>4)|(A&15)<<L))<<k;
          ext(getid(F));
        }
      }
    }
    for(i=0;i<len[n];i++)g[i]=v[i],v[i]=-1;
    h=1,t=z=0;
    ext(0);
    while(h<=t){
      z=v[x=q[h++]]+1;
      if(z>2)continue;
      ll O=f[n][x];
      for(i=1;i<n;i++)for(j=i;j<n;j++){
        ll U=(1ULL<<((j-i+2)*4))-1,F=O;
        int L=(j-i+1)*4;
        for(k=4*(i-1);k>=0;k-=4){
          ll A=(F>>k)&U;
          F^=(A^((A>>4)|(A&15)<<L))<<k;
          ext(getid(F));
        }
      }
    }
    for(ans=5,i=0;i<len[n];i++)if(~v[i]&&~g[i])ans=min(ans,v[i]+g[i]);
    printf("%d\n",ans);
  }
  return 0;
}

  

时间: 2024-10-10 17:44:46

BZOJ1330 : Editing a Book的相关文章

in-place editing 理解

var obj1 = {a : 1}, obj2 = obj1;obj1.a = 2;obj1 === obj2 // true```上面的写法是对 obj 进行了 in-place editing. ```var obj1 = {a: 1}, obj2 = obj1;obj1 = {a: 2};obj1 === obj2; // false```这种写法就是 Immutable 的写法, 通过引用判等就知道对象的值是否变化了.

【软件测试】实现Editing Boxing并测试

问题描述 输入区间仅允许输入1到6个英文字符或数字,按submit结束 若输入不符合要求输出错误信息 等价划分类 有效等价类 无效等价类 E1:长度: 1到6  T1: 长度: 0,7 E2:字符: a-z,A-Z,0-9 T2: 英文.数字以外字符,控制字符,标点符号 对于一个Editing Boxing来说:   长度:字符   C (正确输入) E1:E2 输入正确 W1(一类错误输入) E1:T2 输入输入字符不完全为英文和数字组成 W2(二类错误输入) T1:E2 输入长度超过6或输入

Automatic Editing UVA 10115

#include <stdio.h> #include <string.h> #define MAXL 225+5 #define MAXN 10+5 char find[MAXN][MAXL],replace[MAXN][MAXL]; char text[MAXL],convert[MAXL]; int Find(int,int*); void Replace(int,int); int str_cmp(int,int); int main(){ int N,i,j,k; int

解决UITableView在editing状态下点击任意一行(cell)依旧会触发TableViewCell所绑定的segue 的方法

继续总结 自己在第一个app中遇到的一些小问题 背景条件如下:现有一个prototype cell通过segue(show)与其DetailView相连,此UITableView包含编辑按钮(触发进入编辑editing状态) 如图二,在编辑状态下,假设用户准备选择多个cell进行删除,在用户的finger刚点击任意一个cell时,就已经触发了segue,进入到DetailView中,当通过NV Controller返回时,之前选择的cell当然还在 我所想要的是,在编辑状态下,阻止segue(类

UVa10115_Automatic Editing csdn(小白书字符串专题)

解题报告 题意: 替换字符串,一个单词可重复替换 思路: 这种题都很恶心. #include <iostream> #include <cstring> #include <cstdio> #include <map> using namespace std; char str[1000][1000],ch[1000][1000],sh[1000],str1[1000]; int main() { int n,i,j; while(~scanf("

Laplace mesh editing

实现算法:简易的Laplace mesh editing.(2016年3月5日) $实现过程及原理 Laplace 坐标(算子) . 这里的表示相对坐标,是某一点相对于其1-领域点的中心点的位置,也就是Laplace坐标.为什么这样表示呢?这样的坐标有两个特点: 1.它的方向与法相比较接近. 2.它的大小接近于曲率. 对于一些网格,我们进行拖动一些点,但是又要使得它的形状和原先的尽可能相似,怎么处理呢?假设为已知大概位置的点,其变换后的大概位置是.考虑这样的能量函数: 先来看看这个函数的意义,第

UVa 10115 - Automatic Editing

题目:给你一些字符串的替换关系,以及一个句子.按顺序替换,输出最后结果. 分析:字符串.按照替换顺序依次替换(这个替换用过之后,就不再使用),每个替换可能出现多次. 这里注意,如果当前串中有多个可被当前单词替换的位置,只替换最前面的那个, 下次用本次生成的串替换,而不是整体一次性替换. 说明:注意数据清空. #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio>

Powerful Bash-style command line editing for cmd.exe

https://mridgers.github.io/clink/ Clink Download v0.4.8 ZIP (portable) EXE (installer) Overview Clink combines the native Windows shell cmd.exe with the powerful command line editing features of the GNU Readline library, which provides rich completio

UVA 10115 Automatic Editing(字符处理)

Text-processing tools like awk and sed allow you to automatically perform a sequence of editing operations based on a script. For this problem we consider the specific case in which we want to perform a series of string replacements, within a single