【bzoj4058】[Cerc2012]Who wants to live forever?

原创 2015年11月17日 21:06:46

  手算出奇迹!(雾
  如果只看异或的话,会发现当n为偶数时到第某个次数时会被翻转过来,然后再过某个次数就会被翻转回去,也就是说会循环。然后每一次都会有一个单数位和一个单数位是单独的,因此若要为0,则只能所有数为0。故n为偶数时除非全为0,否则一定LIVES。
  又因为奇偶位数是独立的,手画表的时候也会发现奇数位和偶数位的奇偶数位本质上也是独立的(这个可以从异或的个数看出来),于是就可以分治。
  于是分治判一下是否全0就可以了。
  时间复杂度O(Tnlogn)
  不要用memset!不要用memset!不要用memset!

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define maxn 200007

inline int rd() {
    char c = getchar();
    while (!isdigit(c)) c = getchar() ; int x = c - '0';
    while (isdigit(c = getchar())) x = x * 10 + c - '0';
    return x;
}

char a[maxn];

int s[maxn] , tmp[maxn] , n;

void input() {
    scanf("%s" , a + 1);
    for (n = 1;a[n];n ++) s[n] = a[n] - '0';
    s[0] = s[n] = 0;
    n --;
}

bool work(int l , int r) {
    int p = 0;
    rep (i , l , r) if (s[i]) {
        p = 1;
        break;
    }
    if (!p) return 0;
    if ((r - l) & 1) return 1;
    int t = 0;
    for (int i = l + 1;i <= r;i += 2)
        tmp[++ t] = s[i];
    int m = l + t - 1;
    for (int i = l + 1;i <= r;i += 2)
        tmp[++ t] = s[i + 1] ^ s[i - 1];
    rep (i , 1 , t)
        s[i + l - 1] = tmp[i];
    r = l + t - 1;
    return work(l , m) || work(m + 1 , r);
}

void solve() {
    puts(work(1 , n) ? "LIVES" : "DIES");
}

int main() {
    #ifndef ONLINE_JUDGE
        //freopen("data.txt" , "r" , stdin);
    #endif
    per (T , rd() , 1) {
        input();
        solve();
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

UVALive 7040 Color (容斥原理 + 组合数学递推公式 + 求逆元 + 基础数论)

传送门 英文题目:Recently, Mr. Big recieved n owers from his fans. He wants to recolor those owers with m c...
  • qingshui23
  • qingshui23
  • 2016年04月11日 20:41
  • 1446

node js 进程守护神forever

forever是个啥
  • JBBOY
  • JBBOY
  • 2014年06月27日 17:01
  • 17381

centos7 网络设置

今天在一台PC上安装了CentOS 7,当时选择了最小安装模式,安装完成后马上用ifconfig查看本机的ip地址(局域网已经有DHCP),发现报错,提示ifconfig命令没找到。 [root...
  • beiquandeng
  • beiquandeng
  • 2016年01月16日 14:41
  • 1130

自己动手写shell命令之who

思路:在unix系统中有一个名为utmp的文件,里面存着当前登录到系统中用户的信息。utmp这个文件里面保存的是结构数组,数组元素是utmp类型的结构。实现who命令,只要依次从utmp文件中读出ut...
  • yao_wust
  • yao_wust
  • 2014年10月13日 21:14
  • 1459

unix/linux who命令的实现

Understanding Unix/Linux Programming(Unix/Linux编程实践教程) 学习模式: (1)它能做什么? (2)它是如何实现的? (3)能不能自己编写一个?...
  • qq_33850438
  • qq_33850438
  • 2017年03月07日 14:35
  • 333

unix/linux编程实践教程:who命令

1. who命令的编写
  • fzyz_sb
  • fzyz_sb
  • 2014年08月26日 20:33
  • 1405

Intellij IDEA中通过Live Templates快速生成一段固定格式的代码,如:文本注释等。

在Intellij IDEA中,如果想要快速生成一段代码,比如如下代码。 /** * Created with IntelliJ IDEA * Created by ustcck on 2016...
  • ck4438707
  • ck4438707
  • 2016年10月30日 23:12
  • 2690

who命令的编写——登录与注销__who, whoami, who am i

摘要:who是一个linux下重要的系统内建指令,编写who命令,需要了解相关的数据结构struct utmp。同时进一步熟悉结构化数据的读取和访问方法。另外总结了系统调用相关的知识。...
  • trochiluses
  • trochiluses
  • 2013年09月05日 10:08
  • 1895

linux 性能监控命令——w,who,whoami,whois ,who am i

whois    功能说明:查找并显示用户信息。    语  法:whois [帐号名称]    补充说明:whois指令会去查找并显示指定帐号的用户相关信息,因为它是到Networ...
  • zhaoxiatengkong_1
  • zhaoxiatengkong_1
  • 2013年03月11日 15:10
  • 1364

jQuery1.9+中删除了live以后的替代方法

根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法。并建议在以后的代码中使用on方法来替代。   on方法可以接受三个参数:事件名、触发选择器、事件函数。 ...
  • aya19880214
  • aya19880214
  • 2014年10月11日 18:45
  • 59435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj4058】[Cerc2012]Who wants to live forever?
举报原因:
原因补充:

(最多只允许输入30个字)