Kosaraju算法,然後bitset優化

主要是學習一下自寫bitset的姿勢

#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define dow(i,l,r) for(int i=r;i>=l;i--)
#define rep0(i,r) for(int i=0;i<r;i++)
#define repedge(i,x) for(int i=cur[x];i>=0;i=e[i].next)
#define maxn 550
#define maxm 100100
#define LL long long
using namespace std; int tot,p[maxn],n,m,kk;
char s[maxn]; struct Bitset{
unsigned int v[];
void reset() //clear
{
memset(v,,sizeof(v));
}
void set(int x) //set v[x]=1
{
v[x>>]|=1u<<(x&);
}
void flip(int x) // rev
{
v[x>>]^=1u<<(x&);
}
bool ask(int x) // is == 1?
{
return v[x>>]>>(x&)&;
}
}vis,g[maxn],rg[maxn];
//vis[] =1 not vis,=0 vis
//g[i][j] =1 exist i->j,=0 not exist
//rg[i][j] =1 exist j->i,=0 not exist; void add(int j,int k)
{
g[j].flip(k);
rg[k].flip(j);
} int nlz(unsigned int x)
{
int n;
n = ;
if ((x >> ) == ) {n = n +; x = x <<;}
if ((x >> ) == ) {n = n + ; x = x << ;}
if ((x >> ) == ) {n = n + ; x = x << ;}
if ((x >> ) == ) {n = n + ; x = x << ;}
n = n - (x >> );
return -n;
} void dfs0(int x)
{
vis.flip(x);
rep0(i,) {
unsigned int now=vis.v[i]&g[x].v[i];
while (now) {
dfs0(i<<|nlz(now));
now=vis.v[i]&g[x].v[i];
}
}
p[++tot]=x;
} void dfs1(int x)
{
vis.flip(x);
++tot;
rep0(i,) {
unsigned int now=vis.v[i]&rg[x].v[i];
while (now) {
dfs1(i<<|nlz(now));
now=vis.v[i]&rg[x].v[i];
}
}
} int calc()
{
vis.reset();
rep0(i,n) vis.set(i);
tot=;
rep0(i,n)
if (vis.ask(i)) dfs0(i);
rep0(i,n) vis.set(i);
int ans=;
dow(i,,n)
if (vis.ask(p[i])) {
tot=;
dfs1(p[i]);
ans+=tot*(tot-)/;
}
return ans;
} int main()
{
int tt;
scanf("%d",&tt);
while (tt--) {
scanf("%d %d",&n,&m);
rep0(i,n) {
g[i].reset();
rg[i].reset();
}
rep0(i,n) {
scanf("%s",s);
rep0(j,n)
if (s[j]=='') add(i,j);
}
while (m--) {
scanf("%d",&kk);
while (kk--) {
int j,k;
scanf("%d %d",&j,&k);
add(j-,k-);
}
printf("%d\n",calc());
}
}
return ;
}

另外是一個總結

Bitset
头文件:#include<bitset>
bitset<> bits;
b.any() b中是否存在置为1的二进制位?
b.none() b中不存在置为1的二进制位吗?
b.count() b中置为1的二进制位的个数
b.size() b中二进制位数的个数
b[pos] 访问b中在pos处二进制位
b.test(pos) b中在pos处的二进制位置为1么?
b.set() 把b中所有二进制位都置为1
b.set(pos) 把b中在pos处的二进制位置为1
b.reset( ) 把b中所有二进制位都置为0
b.reset( pos ) 把b中在pos处的二进制位置置为0
b.flip( ) 把b中所有二进制位逐位取反
b.flip( pos ) 把b中在pos处的二进制位取反
b.to_ulong( ) 把b中同样的二进制位返回一个unsigned int __builtin_ffs (unsigned x) 返回x中最后一个1是从右往左第几位
int __builtin_popcount (unsigned x) 返回x中1的个数
int __builtin_ctz (unsigned x) 返回x末尾0的个数(x等于0时未定义)
int __builtin_clz (unsigned x) 返回x中前导0的个数(x等于0时未定义)
int __builtin_parity (unsigned x) 返回x中1的奇偶性

【hdu6072】Logical Chain的更多相关文章

  1. 【HDU 5233】Tree chain problem (树形DP+树剖+线段树|树状数组)最大权不相交树链集

    [题目] Tree chain problem Problem Description Coco has a tree, whose vertices are conveniently labeled ...

  2. 【HDU3487】【splay分裂合并】Play with Chain

    Problem Description YaoYao is fond of playing his chains. He has a chain containing n diamonds on it ...

  3. 【CodeForces】913 E. Logical Expression

    [题目]E. Logical Expression [题意]令x=11110000(2),y=11001100(2),z=10101010(2),n次询问,每次要求用[与][或][非][括号]构成含至 ...

  4. 【POJ 2248】 Addition Chain

    [题目链接] http://poj.org/problem?id=2248 [算法] 搜索剪枝 剪枝1 : 优化搜索顺序,从大到小枚举 剪枝2 : Ai + Aj可能相等,只需搜一次即可 剪枝3 : ...

  5. 【例题 6-3 UVA - 442】Matrix Chain Multiplication

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用栈来处理一下表达式就好. 因为括号是一定匹配的.所以简单很多. ab x bc会做abc次乘法. [代码] #include< ...

  6. OpenStack-Neutron-Fwaas-代码【一】

    Kilo的代码中对Fwaas做了优化,可以将规则应用到单个路由上 但是juno里面还是应用到租户的所有路由上的,因此对juno的代码做了修改 1. 介绍 在FWaaS中,一个租户可以创建多个防火墙,而 ...

  7. 【译】Android API 规范

    [译]Android API 规范 译者按: 修改R代码遇到Lint tool的报错,搜到了这篇文档,aosp仓库地址:Android API Guidelines. 58e9b5f Project ...

  8. 论文阅读(Xiang Bai——【CVPR2012】Detecting Texts of Arbitrary Orientations in Natural Images)

    Xiang Bai--[CVPR2012]Detecting Texts of Arbitrary Orientations in Natural Images 目录 作者和相关链接 方法概括 方法细 ...

  9. 【初级】linux pwd 命令详解及使用方法实战

    pwd:查看当前工作目录 前言: Linux中用 pwd 命令来查看”当前工作目录“的完整路径,就是经常提及的所在目录,多用在生产环境多级目录中查看当前所在路径,使用此命令能给运维人员/操作人员带来很 ...

随机推荐

  1. springmvc @Valid 接收实体类时出现bean为null的问题

    这是因为传到后端之后,全部以全小写形式处理了 所以前端也需要把name设置为全小写,否则后端不识别,导致接收不到,导致为null

  2. 通过redis实现session共享-php

    <?php class redisSession{ /** * 保存session的数据库表的信息 */ private $_options = array( 'handler' => n ...

  3. git分支在团队中的使用

    须知 在介绍分支常用操作之前 我们需要知道几点: 1.主干不允许做任何修改结构或者业务的操作. 有两种情况可以修改主干: 就是当前主干已经是有问题的,合并后出问题发布不了. 修改与业务无关的配置文件, ...

  4. 利用webbrowser自动查取地点坐标

    概述 有时候我们需要去查询某些地点的坐标,那么我们可以用百度提供的坐标拾取系统http://api.map.baidu.com/lbsapi/getpoint/index.html,但是会发现它只能一 ...

  5. C# 多线程的等待所有线程结束的一个问题

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. 从零开始的Python学习Episode 11——装饰器

    装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 import time def show_time(f): de ...

  7. A Product Recall 产品召回

    Rick: The Board of Directors has come to a decision. Our company will take an image hit, and it's go ...

  8. ES6的新特性(4)——字符串的扩展

    字符串的扩展 ES6 加强了对 Unicode 的支持,并且扩展了字符串对象. 字符的 Unicode 表示法 JavaScript 允许采用\uxxxx形式表示一个字在\u0000~\uFFFF之间 ...

  9. 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结

    20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...

  10. AOP:Spring的xml配置方式

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...