题意 : 给你两个只包含 0 和 1 的字符串 a, b,定义函数 f ( A, B ) 为 字符串A和字符串B 比较

存在多少个位置 i 使得 A[ i ] != B[ i ] ,例如

  • f(00110,01100)=2
  • f(00110,11000)=4
  • f(00110,10001)=4
  • f(00110,00010)=1

问你 取出 a 中 所有 长度 为 lenb (字符串b的长度) 的子串 c, 求 f ( c, b) 为偶数的 c 的个数。

解 : 显然, a 中 存在  lena - lenb + 1 个 c, 直接枚举显然是爆的, 字符串只包含 0 1 且 题目只问 f ( b, c ) 的奇偶性。

想到异或,若 在位置 i 上 b[ i ] != c[ i ], 则 b[ i ] ^ c[ i ]  = 1; 否则  b[ i ] ^ c[ i ]  = 0;

所以可以 用 一个 ans 来记录  f ( b, c) 的奇偶性, 那么只要枚举 b字符串的长度,然后 ans = ans ^ b[ i ] ^ c[ i ] 就行了

最后判断一下 ans 的奇偶性看满不满足就行了。

这题的关键是 a  的 长度为 lenb 的子串 c 有很多, 你不可能对于每个 c 都去遍历一遍 b字符串。

首先,枚举a 的所有长度为 lenb 的子串 c  枚举 i , 字符串 c 就是 a[ i ] ~ a[ i + lenb - 1];

首先,先取第一个 c ;  a[ 0 ] ~ a[ lenb - 1] 与 b 进行比较 求出 ans0;

然后 对于 第二个 c : a[ 1 ] ~ a[ lenb ] 的 ans1   就会等于 ans0 ^ a[ 0 ] ^ a[ lenb ];

同理 对于 第 i 个 c:  a[ i ] ~ a[ i + lenb - 1 ] 的 ans( i ) = ans( i - 1 ) ^ a[ i - 1 ] ^ a[ i + lenb - 1]

为什么可以这样写呢; 那就是 因为异或的性质啦。  异或 a [ i - 1 ] 是消除 a[ i - 1 ] 的影响

异或 a [ i + lenb - 1] 是加入计算;

举个例: 现在令  a = 01100010  ;  b = 00110;

第一个 c 的 ans 是

( 0 ^ 0 )^( 1 ^ 0 )^( 1 ^ 1 )^( 0 ^ 1 )^( 0 ^ 0 )

第二个 c 的 ans

( 0 ^ 0 )^( 1 ^ 0 )^( 1 ^ 1 )^( 0 ^ 1 )^( 0 ^ 0 )^ 0 ^ 0   // 第一个0 是a[ i - 1 ],第二个0是a[ i + lenb - 1 ];

=  0 ^ ( 0 ^ 0 )^( 1 ^ 0 )^( 1 ^ 1 )^( 0 ^ 1 )^( 0 ^ 0 )^ 0  // 异或两次相当于没有异或

= ( 0 ^ 1)^( 0 ^ 1 )^( 1 ^ 0 )^( 1 ^ 0 )^( 0 ^ 0 )

用到了 异或 运算  的 交换律 和  异或两次等于没异或的性质。   挺巧妙的这个思维。

代码里 的 i 和我说的 i 不一样,不过道理都是一样的啦;

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define LL long long
#define ULL unsigned long long
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define dep(i,j,k) for(int i=k;i>=j;i--)
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define make(i,j) make_pair(i,j)
#define pb push_back
#define Pi acos(-1.0)
using namespace std;
const int N = ;
int main() {
string a, b;
cin >> a >> b;
int ans = , coun = ;
int lena = a.size(); int lenb = b.size();
rep(i, , lenb - ) ans = ans ^ ( a[i] - '') ^ (b[i] - '');
if(ans % == ) coun++;
rep(i, lenb, lena - ) {
ans = ans ^ (a[i - lenb] - '') ^ (a[i] - '');
if(ans % == ) coun++;
}
cout << coun << endl;
return ;
}

C Vus the Cossack and Strings ( 异或 思维)的更多相关文章

  1. CodeForces - 1186 C. Vus the Cossack and Strings (异或)

    Vus the Cossack has two binary strings, that is, strings that consist only of "0" and &quo ...

  2. Vus the Cossack and Strings(Codeforces Round #571 (Div. 2))(大佬的位运算实在是太强了!)

    C. Vus the Cossack and Strings Vus the Cossack has two binary strings, that is, strings that consist ...

  3. codeforces 1186C Vus the Cossack and Strings

    题目链接:https://codeforc.es/contest/1186/problem/C 题目大意:xxxxx(自认为讲不清.for instance) 例如:a="01100010& ...

  4. Codeforces F. Vus the Cossack and Numbers(贪心)

    题目描述: D. Vus the Cossack and Numbers Vus the Cossack has nn real numbers aiai. It is known that the ...

  5. E. Vus the Cossack and a Field (求一有规律矩形区域值) (有一结论待证)

    E. Vus the Cossack and a Field (求一有规律矩形区域值) 题意:给出一个原01矩阵,它按照以下规则拓展:向右和下拓展一个相同大小的 0 1 分别和原矩阵对应位置相反的矩阵 ...

  6. Codeforces Round #571 (Div. 2)-D. Vus the Cossack and Numbers

    Vus the Cossack has nn real numbers aiai. It is known that the sum of all numbers is equal to 00. He ...

  7. 题解【Codeforces1186A】 Vus the Cossack and a Contest

    这题是入门难度的题目吧-- 根据题意可以得出,只有当\(m\)和\(k\)都大于等于\(n\)时,\(Vus\)才可以实现他的计划. 因此,我们不难得出以下\(AC\)代码: #include < ...

  8. 『Codeforces 1186E 』Vus the Cossack and a Field (性质+大力讨论)

    Description 给出一个$n\times m$的$01$矩阵$A$. 记矩阵$X$每一个元素取反以后的矩阵为$X'$,(每一个cell 都01倒置) 定义对$n \times m$的矩阵$A$ ...

  9. Codeforces 1186F - Vus the Cossack and a Graph 模拟乱搞/欧拉回路

    题意:给你一张无向图,要求对这张图进行删边操作,要求删边之后的图的总边数 >= ceil((n + m) / 2), 每个点的度数 >= ceil(deg[i] / 2).(deg[i]是 ...

随机推荐

  1. git回退

    以前,如果是要去除某一块功能,我都是选择性删除,选择性注释,然后前后逻辑各种查看,各种比较.每一次,改完这些我总感觉心好累啊!!!然后,我就发现了 Git 一个非常强大的功能:回滚.当然我还是喜欢叫它 ...

  2. JavaScript-checkbox标签-隐藏、显示、全选、取消和反选等操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. MySQL 事务、视图、索引

    一.事务(Transaction) 1.1 什么是事务? SQL中,事务是指将一系列数据操作捆绑成为一个整体进行统一管理. 如果一个事务执行成功,该事务中进行的所有数据均会提交,称为数据库中的永久组成 ...

  4. Spring的核心jar包

    Spring的主要jar包 四个核心jar包:beans.context.core.expression Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现Spring ...

  5. linux重装docker-compose后无法执行docker-compose命令

    背景 使用自动化脚本重装docker和docker-compose(但脚本中未对旧版本的docker-compose进行任何处理,比如卸载删除) 导致执行docker-compose命令时报了错,大多 ...

  6. 简单粗暴 每个servlet之前都插入一段代码解决 乱码问题

    response.setHeader("content-type", "text/html;charset=UTF-8"); response.setChara ...

  7. C# Winform 带水印提示输入框

    using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms ...

  8. 使用TextView和Textedit

    1.TextView  res/layout 中设置布局文件 hint属性:提示输入信息text属性:与hint的区别---hint仅仅是提示:text是实际的内容讲布局xml文件引入到activit ...

  9. 8.7.ZooKeeper Watcher监听

    1.ZooKeeper Watcher ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象, 当这个主题对 ...

  10. uCos-II移值(二)

    os_cpu_c.c文件 该文件主要是根据处理器平台特点完成任务堆栈初始化函数OSTaskStkInit以及其他几个用户Hook函数的编写,其中必须要实现的函数是OSTaskStkInit(在创建任务 ...