[TJOI2008]彩灯

Posted ruoruoruo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[TJOI2008]彩灯相关的知识,希望对你有一定的参考价值。

题目描述

Peter女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜。已知一组彩灯是由一排N个独立的灯泡构成的,并且有M个开关控制它们。从数学的角度看,这一排彩灯的任何一个彩灯只有亮与不亮两个状态,所以共有2N个样式。由于技术上的问题,Peter设计的每个开关控制的彩灯没有什么规律,当一个开关被按下的时候,它会把所有它控制的彩灯改变状态(即亮变成不亮,不亮变成亮)。假如告诉你他设计的每个开关所控制的彩灯范围,你能否帮他计算出这些彩灯有多少种样式可以展示给他的女朋友?

注: 开始时所有彩灯都是不亮的状态。

输入格式

每组测试数据第一行为两个整数N和M,用空格隔开。紧接着是有M行,每行都是一个长度为N的字符串,表示一个开关控制彩灯的范围(N盏灯),如果第i个字母是大写字母’O’,则表示这个开关控制第i盏灯,如果第i个字母是大写字母’X’,则表示这个开关不控制此灯。

输出格式

输出这些开关和彩灯可以变换出来的样式数目。由于这个值可能会很大,请求出它对于整数2008的余数。

输入输出样例

输入 #1
2 3
OO
XO
OX
输出 #1
4

说明/提示

可见样例中第一个开关控制了所有的彩灯,而后两个开关分别控制了第一个和第二个彩灯,这样我们可以只用后两个开关控制彩灯,可以变换出来所有的22个状态。

30%的数据中,N和M不超过15。

另外有40%的数据中,N和M有一个为50

100%的数据中,N和M不超过50。

 

题目问的就是在所有01串中任选起来异或,一共能得到多少不同的结果

构造线性基,因为把原先数字选出来异或可以看作在线性基里选数字出来异或

而线性基里的数字满足只要选择不同则结果不同的性质,方便计算

如果线性基里有$x$个数字,则答案为$2^x$

注意取模

#include <string>
#include <iostream>
using namespace std;
typedef long long ll;
string s;
ll p[70] = 0;
int main()
    int n, m;
    cin >> n >> m;
    ll x;
    while(m--)
        cin >> s;
        x = 0;
        for(int i = 0; i < n; i++)
            x |= (ll)(s[i] == O) << i;
        
        for(int j = 60; ~j; j--)
            if(x & 1LL << j)
                if(p[j])
                    x ^= p[j];
                
                else
                    p[j] = x;
                    break;
                
            
        
    
    int tot = 0;
    for(int j = 60; ~j; j--)
        if(p[j])
            tot++;
        
    
    cout << (1LL << tot) % 2008 << endl;
    return 0;

 

 

以上是关于[TJOI2008]彩灯的主要内容,如果未能解决你的问题,请参考以下文章

题解 luogu 3857 [TJOI2008]彩灯 (线性基)

P3857 [TJOI2008]彩灯(线性基)

[TJOI2008]彩灯 线性基

Luogu P3857 [TJOI2008]彩灯

luogu3856TJOI2008公共子串 [动态规划]

基于单片机的彩灯控制器系统设计-多模式彩灯-毕设课设资料