【C++从入门到踹门】第十九篇:bitset(位图)的使用与实现

24 篇文章 23 订阅
订阅专栏


在这里插入图片描述


概念引入

给40亿个不重复的无符号整数,且为乱序,给一个无符号整数,如何快速判断一个数是否在这40亿个数中?

常规的想法是将40亿个数存入数组中,快速排序然后采用二分法查找,时间复杂度O(NlogN).或者是将一堆数存入unordered_set容器中,使用find进行查找,时间复杂度为O(N)。

但是内存空间存不下这么多的数字:

40亿≈232=22 * 2^10 * 2^10 * 2^10=4 * 1024 * 1024 * 1024 = 4G

每个整数占4字节,所以40亿个整数占用16G字节的空间

而一台32位机的内存地址有32位,每个地址指向1字节(8bits)的数据,其内存地址空间的大小只有2^32=4G字节的空间大小,由于系统本身要占据一部分内存,我们可用的内存只有3.2G左右。

如果我们直接按整型的方式40亿个整数存入内存显然是不可能的事。

于是我们需要使用位图(bitset)来解决:

这个问题只需要考虑数字在或者不在,那么我们仅需要0,1来表示其存在性(0表示不在,1表示存在),而使用二进制比特位来标记该数字的位置:

在这里插入图片描述

那么每个数的是否存在仅用一个bit位就能表示了。

40亿个数的状态占用2^32个bit=4 * 1024 * 1024 * 1024 bit=0.5G ,显然内存占用变小了很多。

所谓位图,就是用比特位来存放数据的状态,适用于海量数据,数据无重复的场景,通常用于判断数据存不存在。

bitset类

标准库提供了位图:

在这里插入图片描述

该类模拟了bool类型元素的数组,但是每个元素只占用一个bit位,一个char可以存放8个元素。

每一个位的位置可以单独访问,例如一个bitset对象foo,可以类似于数组使用下标访问的方式:foo[ 3 ],来访问第四个元素。

模板参数N表示元素的数量。

bitset的构造

在这里插入图片描述

  • (1)默认构造函数
    所有元素都初始化为0

  • (2)使用整型初始化
    元素按照给定整数的二进制位进行初始化:0xff ——> 1111 1111

  • (3)字符串初始化
    使用01的string进行初始化:std::string(“01101001”) ——> 01101001

    使用01的字符串进行初始化:(“01101001”) ——> 01101001

  • 案例

#include <iostream>       // std::cout
#include <string>         // std::string
#include <bitset>         // std::bitset

int main ()
{
  std::bitset<16> foo;
  std::bitset<16> bar (0xfa2);
  std::bitset<16> baz (std::string("01101001"));
  std::bitset<16> baz2("01101001");

  std::cout << "foo: " << foo << '\n';
  std::cout << "bar: " << bar << '\n';
  std::cout << "baz: " << baz << '\n';
  std::cout << "baz2: " << baz2 << '\n';

  return 0;
}

在这里插入图片描述

下标访问 operator[]

在这里插入图片描述

返回pos位的元素值或者引用,但是不执行范围检查,建议使用bitset::test ,其会检查边界。

  • 案例
int main ()
{
  std::bitset<4> foo;

  foo[1]=1;             // 0010
  foo[2]=foo[1];        // 0110

  std::cout << "foo: " << foo << '\n';

  return 0;
}

在这里插入图片描述

返回bit位值 test

在这里插入图片描述

int main()
{
	std::bitset<5> foo(std::string("01011"));

	std::cout << "foo contains:\n";
	
	//运行下面的语句,将bool值从0,1转化为false,true
	std::cout << std::boolalpha;
	
	for (std::size_t i = 0; i < foo.size(); ++i)
		std::cout << foo.test(i) << '\n';
}

在这里插入图片描述

当使用boolalpha后,以后的bool类型结果都将以true或false形式输出,除非使用noboolalpha取消 boolalpha流的格式标志。

设置比特位 set

  • (1)把所有比特位都设置为1

  • (2)把pos处的比特位设置为1(默认true),或者第二个参数给为0(或者false),则可将pos位置为0.

  • 案例

int main()
{
    std::bitset<4> foo;
	std::cout << foo.set() << '\n';       // 1111
	std::cout << foo.set(0, 0) << '\n';   // 1110
	std::cout << foo.set(2, false) << '\n';   // 1010
	std::cout << foo.set(0,1) << '\n';      // 1011
	std::cout << foo.set(2,true) << '\n';      // 1111

	return 0;
}

在这里插入图片描述

重置比特位 reset

在这里插入图片描述

  • (1)将所有bits重置为0

  • (2)pos位置为0

  • 案例

int main()
{
    std::bitset<4> foo(std::string("1011"));

	std::cout << foo.reset(1) << '\n';    // 1001
	std::cout << foo.reset() << '\n';     // 0000
	
	return 0;
}

在这里插入图片描述

计算元素数量 size/count

在这里插入图片描述

size返回元素的总数量,即模板参数中我们给的N。

count 返回元素中被set的元素数量。

  • 案例
int main()
{
    std::bitset<8> foo("01101001");
	std::cout << foo << " has ";
	std::cout << foo.count() << " ones and ";
	std::cout << (foo.size() - foo.count()) << " zeros.\n";
	return 0;
}

在这里插入图片描述

翻转位 flip

在这里插入图片描述

  • (1)翻转所有位
  • (2)翻转pos位
int main ()
{
  std::bitset<4> foo (std::string("0001"));

  std::cout << foo.flip(2) << '\n';     // 0101
  std::cout << foo.flip() << '\n';      // 1010

  return 0;
}

测试bitset对象中是否已有bite位被set —— any,none,all

在这里插入图片描述

在这里插入图片描述

如果至少有一个bit位已设置,any返回true,否则none返回真.如果所有bit位都已set,则all返回true。

int main()
{
    std::bitset<16> foo;

	std::cout << "输入二进制数:";
	std::cin >> foo;

	if (foo.any())
		std::cout << foo << " has " << foo.count() << " bits set." << std::endl;
	else
		std::cout << foo << " has no bits set." << std::endl;

	foo.reset();

	if (foo.none())
		std::cout << foo << " has no bits set." << std::endl;

    foo.set();
    if(foo.all())
        std::cout << foo << " all bits set." << std::endl;

	return 0;
}

在这里插入图片描述

bitset的运算符重载

在这里插入图片描述

int main ()
{
  std::bitset<4> foo (std::string("1001"));
  std::bitset<4> bar (std::string("0011"));

  std::cout << (foo^=bar) << '\n';       // 1010 (XOR,assign)
  std::cout << (foo&=bar) << '\n';       // 0010 (AND,assign)
  std::cout << (foo|=bar) << '\n';       // 0011 (OR,assign)

  std::cout << (foo<<=2) << '\n';        // 1100 (SHL,assign)
  std::cout << (foo>>=1) << '\n';        // 0110 (SHR,assign)

  std::cout << (~bar) << '\n';           // 1100 (NOT)
  std::cout << (bar<<1) << '\n';         // 0110 (SHL)
  std::cout << (bar>>1) << '\n';         // 0001 (SHR)

  std::cout << (foo==bar) << '\n';       // false (0110==0011)
  std::cout << (foo!=bar) << '\n';       // true  (0110!=0011)

  std::cout << (foo&bar) << '\n';        // 0010
  std::cout << (foo|bar) << '\n';        // 0111
  std::cout << (foo^bar) << '\n';        // 0101

  return 0;
}

自己实现一个bitset

如果我们以一个整型作为比特位的容器,那么如果要求0~N范围的比特位,就需要有N/32+1 个整型来容纳这些比特位,同理如果以char为容器,则需要N/8+1个char来容纳N个比特位。这里我们用char数组作为底层容纳比特位的容器。

namespace mystd 
{
	template<size_t NUM>
	class bitset
	{
	public:

		bitset()
		{
			_bits.resize(NUM/8+1, 0);
		}

		void set(size_t pos)//设置指定位或者所有位
		{}

		void reset(size_t pos)//清空指定位或者所有位
		{}

		bool test(size_t pos)//获取指定位状态
		{}

        void flip(size_t pos)//翻转指定pos
        {}

        size_t count()//统计set的位数
        {}

        bool none()//没有bit为被set返回true
        {}

        bool any()//至少一个bit位set返回true
        {}

        bool all()//全部NUM个bit位被set返回true
        {}

	private:
		vector<char> _bits;//位图
	};
}

set reset test flip

  • set是将pos位的0置为1。

首先通过 i=pos/8 找到bit位在第i个char中,再通过 j=pos%8 找到在这个char的第j位bit位上。将1左移j位后于这个char按位或运算即可。

在这里插入图片描述

void set(size_t pos)//设置指定位或者所有位
{
    size_t i = pos / 8;
    size_t j = pos % 8;

    _bits[i] |= (1 << j);
}
  • reset 将pos置0也是同理,将1左移j位,按位取反,再和这个char按位与运算即可:

在这里插入图片描述

void reset(size_t pos)//清空指定位或者所有位
{
    size_t i = pos / 8;
    size_t j = pos % 8;
    
    _bits[i] &= (~(1 << j));
}
  • test获取位的状态,将1左移j位,再和这个char按位与运算即可:

在这里插入图片描述

bool test(size_t pos)//获取指定位状态
{
    size_t i = pos / 8;
    size_t j = pos % 8;

    return _bits[i] & (1 << j);
}
  • flip翻转位
  1. 计算出该位位于第 i 个char的第 j 个比特位。
  2. 将1左移 j 位后与第 i 个char进行按位异或运算即可。

在这里插入图片描述

void flip(size_t pos)
{
    size_t i=pos/8;
    size_t j=pos%8;

    _bits[i]^=(1<<j);
}

count

count 获取位图中被设置的位的个数,遍历每一个char,统计每个char中的二进制位1的个数

统计二进制中1的个数的方法:

  1. n = n & (n-1) => 消去n的二进制数中最右边的1;
  2. n不为零继续执行第一步;
  3. 执行了几次说明n中有多少个1;

在这里插入图片描述

size_t count()
{
    size_t count;
    for(auto e:_bits)
    {
        int n=e;
        while(n)
        {
            n=n&(n-1);
            count++;
        }
    }
    return count;
}

none any all

  • none

遍历每一个char 如果全为0,则none返回true

bool none()
{
	//遍历每个char
	for (auto e : _bits)
	{
		if (e != 0) //该整数中有位被设置
			return false;
	}
	return true; //全部整数都是0,则没有位被设置过
}
  • any

是none的逆操作

bool any()
{
	return !none(); 
}
  • all

每一个char中的二进制位全为1,除了最后一个char的剩余的比特位。所以需要分情况:

在这里插入图片描述

bool all()
{
    size_t size = _bits.size();
    for(size_t i = 0;i < size-1;++i)
    {
        if(~_bits[i]!=0)//取反应该为0,否则取反之前不全为1
            return false;
    }

    for(size_t j = 0;j < NUM % 8 ;++j)
    {
        if((_bits[size-1] & (1<<j))==0)
        {
            return false;
        }
    }
    return true;
}

应用

100亿个整数

给定100亿个整数,设计算法找到只出现1次的整数?

100亿个整数,占用40GB内存,如使用位图将占用512MB内存(因为整型为4字节,不会超过32位,2^32bits=512MB)。整数的出现次数有三种状态

  1. 出现0次
  2. 出现1次
  3. 出现2次及以上

由于一个bit位只能记录两种状态,所以这里需要两个bit位来记录3种状态。我们设计一个类其中封装两个bitset

在这里插入图片描述

template<size_t N>
	class TwoBitset
	{
	public:
		void set(size_t pos)
		{
			if (!_bs1.test(pos) && !_bs2.test(pos))//00 -> 01
			{
				_bs1.set(pos);
			}
			else if (_bs1.test(pos) && !_bs2.test(pos))//01->10
			{
				//出现次数置为2
				_bs1.reset(pos);
				_bs2.set(pos);
			}
			//10 表示已经出现两次或以上,不用处理
		}

		//找出 出现次数为1(01)的整数,即只出现一次
		void PrintOnceNum()
		{
			for (size_t i = 0; i < N; ++i)
			{
				if (_bs1.test(i))
				{
					cout << i << ' ';
				}
			}
		}

	private:
		std::bitset<N> _bs1;
		std::bitset<N> _bs2;
	};

文件交集

给你两个文件,每个文件分别有100亿个整数,1G可用内存,如何找到两个文件的交集?

答1:使用哈希函数将第一个文件中的所有整数映射到1000个文件中,如何哈希函数分配合理,那么每个文件几乎可以均匀的分到1000万个整数(4Bytes * 10 * 1000 * 1000 =40MB),将这1000个文件记为a1,…,a1000。同理将第二个文件也利用哈希函数均分1000个文件记为b1,…,b1000。由于是使用同一个哈希函数,两个文件一样的整数会被分到文件下标一致的文件中,那么分别对a1和b1求交集,…,a1000和b1000求交集,每次比较只会占用80MB内存,最后将交集的结果汇总即可。

答2:还是使用位图的方法,分别使用两个位图记录整数是否出现。最后将遍历两个位图,每位按位与运算,如果结果为true则说明为交集整数。

在这里插入图片描述

100亿个整数 1G可用内存

1个文件有100亿个int,1G可用内存,设计算法找到出现次数不超过两次的所有整数

两个位图

  1. 出现0次 :00
  2. 出现1次 :01
  3. 出现2次 :10
  4. 出现3次及以上 :11

这里出现了四种状态,需要两个位图即可解决;

以此类推如果题目要求为找出不超过5次的整数,那么3个位图可描述8个状态,可以应付这种要求。


— end —

青山不改 绿水长流

C++标准库bitset类型的简单使用方法介绍
12-26
std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位。 #include using std::bitset; 一句...
问题 B: Bitset I - Bit Operation I
12-26
10進数で与えられた非負の整数xを2進数に変換し、32桁のビット列bとして出力してください。さらに、bに対して以下の処理をそれぞれ行ったビット列を出力してください。 反転: 全てのビットを反転する 左シフト: ...
bitset详解c++
CSer
06-17 1万+
basis bitset 的构造 bitset的操作 一些高级用法 将Bitsets视为一组标志 一些简单的原子操作,往往能组合出复杂而强大的功能。位操作的深远意义不在于表示一种数值,而是可能的情况数。我虽然暂时不知道bitset能组合出如何复杂的功能,但冥冥之中却有这样的直觉感受。 basis bitset所在的头文件<bitset> 命名空间std bits...
bitset函数
wzc200406的博客
05-24 1092
bitset可以说是一个多位二进制数,每八位占用一个字节,因为支持基本的位运算,所以可用于状态压缩,n位bitset执行一次位运算的时间复杂度可视为n/32.若s至少有一位为1,则s.any()返回true,s.none()返回false;若s所有位都为0,则s.any()返回false,s.none()返回true;s.set(k,v)把s的第k位改为v,即s[k]=v;s.reset(k)把s的第k位改为0,即s[k]=0;s.flip(k)把s的第k位取反,即s[k]^=1;通过率:72.20%
bitset详解
最新发布
weixin_71276184的博客
03-19 1000
就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的。C++中以bitset定义为位,下面我们来看一下C++对位的解释吧!在C++中,位以非类型的模版参数定义,简单翻译下来就是:位存储比特位(其存储的元素只有0/1两个值)。
bitset
努力的小白马
05-04 832
目录BitsetBitset 与 STL使用头文件构造函数成员类成员函数位操作(set、reset、flip)Bitset操作 今天学习线性基优化bitset,需要使用bitset,那么就总结一下吧! Bitset bitset存储bit位(元素只有两个可能的值:0或1,true或false,…) 该类模拟bool元素数组,但为空间分配进行了优化:通常,每个元素只占用1位(在大多数系统中,这比最小的元素类型char少8倍)。 每个位位置都可以单独访问:例如,对于给定的bitset foo,表达式foo
C++——bitset
JAN6055的博客
03-17 1万+
bitset——简单又方便的位运算工具
C++STL详解(十一)-- 位(bitset)
清欢Allen的技术博客
04-28 1871
有一道面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?内存内查找: 面对40亿个无符号整数,我们可以使用搜索树和哈希表,时间复杂度也就为O(1),因为搜索树不仅存储数据,还要存储颜色,parent,child指针等,哈希表还要存储迭代器,size等内置成员,进而导致内存存不下.文件内查找:排序 + 二分查找,时间复杂度为0(1),但是数据太大,只能放在文件上,但是磁盘运行效率太低,不好支持二分查找).综合以上情况,我们可以采取位解决。
bitset(C++实现
Man9o
12-15 1564
实际上就是一个指定比特位个数的连续内存空间,所以可以用STL内置的容器vector管理,除此之外,理论上任何类型都可以作为元素的类型,只不过为了容易理解,它的每个元素的类型被设定为char。
bitset的基本用法
热门推荐
qq_44872284的博客
05-13 3万+
一、概念 bitset可以说是一个多位二进制数,每八位占用一个字节,因为支持基本的位运算,所以可用于状态压缩,n位bitset执行一次位运算的时间复杂度可视为n/32. 二、基本操作 1.定义: bitset< n > s; 表示一个n位的二进制数,<>中填写位数; 2.位运算操作符: ~s: 返回对s每一位取反后的结果; &,|,^:返回对两个位数相同的bitset执行按位与、或、异或运算的结果; <<, >>:返回把一个bitset左移,右移若干
c++bitset详解
Yoyo的博客
08-07 815
通常我们是使用的数据类型都是以字节为单位的,bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一,int的三十二分之一,特定的情况可以节约大量内存空间,另外完美支持了各种运算操作。下面,就让我们来仔细研究有关bitset的相关知识吧!
【C++】哈希的应用——bitset(STL)位
m0_64224788的博客
04-17 1797
我们在判断一个数据是否在给定的整形数据中,结果只有在或者不在这两种状态,那么就可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。这里我们采用直接定址法的哈希,用一个比特位标识映射值在不在,这就是位
bitset的用法
森明帮大于黑虎帮的博客
04-12 6385
bitset的用法
详解C++ bitset用法
01-01
C++的 bitsetbitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset bitset1;  //无参构造,长度为4,默认每一位为0 bitset bitset2(12);  //长度为8,二进制保存,前面用0补充 string s = 100101; bitset bitset3(s);  //长度为10,前面用0补充 char s2[] = 10101; bitset bitset4(s2);  //长度为1
问题 C: Bitset I - Bit Operation II
12-26
10進数で与えられた2つの非負の整数a, bを2進数として扱い、それらのAND(論理積)、OR(論理和)、XOR(排他的論理和)を求め、32桁のビット列として出力してください。
c++遗传算法,用bitset实现
12-31
使用C++编写的遗传算法,代码量200行左右,供大家学习研究,互相交流。
【算法竞赛学习笔记】Bitset详解和应用
SC_Linno的博客
10-31 1528
title : bitset date : 2021-8-20 tags : ACM,数据结构 author : Linno Bitset bitset是一种类似数组的数据结构,它的每一个元素只能是0或1,每个元素只用1bit的空间。可以使用只包含‘0’或‘1’的字符串构造。 优点 支持所有的位运算。 空间占用非常小,也可用于优化时间。 声明方式 #include<bitset> bitset<30>bi; string s="100101"; bitset<10>.
【C++】 bitset(位)的使用
M的博客
01-02 1660
bitset(位)的基本使用
在一个std::bitset中追加另一个std::bitset
12-04
在一个std::bitset中追加另一个std::bitset,可以使用`operator+=`或者`insert()`函数。这两个函数都可以将一个std::bitset追加到另一个std::bitset的末尾。 使用`operator+=`的示例代码: ```cpp #include #...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 无符号数的加减运算 10845
  • 【Linux】第二篇:Linux环境及开发工具 6259
  • 【C++从入门到踹门】第十九篇:bitset(位图)的使用与实现 4457
  • C语言数据结构(2)——单链表 2516
  • (C语言)扫雷——防止第一次踩雷+展开 2372

分类专栏

  • Linux 15篇
  • 项目 2篇
  • C++ 24篇
  • C 21篇

最新评论

  • 【C++从入门到踹门】第十七篇(上):红黑树的实现

    qq_43363641: 删除应该不会出现删除黑结点 黑兄弟 还有双黑侄这种情况 侄子必然为空吧

  • leetcode225 用队列实现栈(C语言)

    qq_51523581: 您好 方便问一下 为什么在创建栈的时候 malloc开辟的地址可以同时给两个队列赋值啊?

  • 无符号数的加减运算

    m0_46431528: nbnb

  • 【C++从入门到踹门】第十八篇(下):使用哈希表封装unorder_map和unordered_set

    Helloooooooo_: 看懂了,写得很好。素质三连奉上!!!

  • 【C++从入门到踹门】第十八篇(上):哈希表实现

    Helloooooooo_: 写得很好,三连了。

大家在看

  • 2024 年勒索软件将比以往更加残酷 334
  • 预处理(下)
  • oracle的json_arrayagg的用法和例子
  • Oracle的listagg的用法和例子
  • 软件项目安全保证措施(Word原件) 145

最新文章

  • 【项目】负载均衡OnlineJudge
  • 【项目】 基于BOOST的站内搜索引擎
  • 【C++从入门到到踹门】第二十一篇:C++11
2022年39篇
2021年32篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码景德镇网站建设多少钱宣城百搜标王公司抚顺企业网站制作报价桐城seo推荐景德镇外贸网站设计公司宜宾建网站来宾SEO按效果付费报价天津SEO按效果付费价格淮北网站定制价格罗湖网站改版报价德阳网络推广公司南京SEO按天计费报价深圳网站优化推广多少钱恩施SEO按效果付费推荐汕尾百度seo推荐九江网站关键词优化多少钱拉萨网站优化多少钱舟山优秀网站设计霍邱网站开发哪家好安阳网站优化推广推荐朔州阿里店铺运营信阳关键词排名公司宁波营销网站推荐果洛百姓网标王推荐兴安盟关键词排名包年推广多少钱海口网站制作设计济南网站设计公司通化网站定制多少钱运城百度标王洛阳外贸网站建设哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化