偶串

题目描述

一个字符串S是偶串当且仅当S中的每一个字符都出现了偶数次。如字符串”aabccb”是一个偶串,因为字符a,b,c都出现了两次。而字符串”abbcc”不是偶串,因为字符a出现了一次。
现在给出一个长度为n的字符串T=t1,t2,t3,…,tn。字符串的子串为其中任意连续一段。T长度为1的子串有n个,长度为2的子串有n-1个,以此类推,T一共有n(n+1)/2个子串。给定T,你能算出它有多少个子串是偶串吗?
输入
输入一个字符串T,T中只有小写字母。T的长度不超过100000。

样例输入
abbc

输出
输出一个数,T的所有子串中偶串的个数。

样例输出
1
时间限制
C/C++语言:2000MS其它语言:4000MS
内存限制
C/C++语言:65536KB其它语言:589824K

解题思路
参考官方思路。这题一看就较为复杂,暴力算法检索所有子串,判断为否为偶串时间复杂度太高。先从简单的问题入手,如果给你一个子串,怎么样判断是否为偶串呢?其实我们并不在乎字母具体出现次数,只要知道出现的奇偶就可以。那这样的话,我们可以考虑用26bit的数来代表一个子串的字母出现次数奇偶的状态,每一位对于着26个字母里的位数。统计结果如果为零(即都为偶数个)则是偶串。
对于字符串中随意一段子串呢,若起始点分别为L,R。F代表从0点开始的状态函数(理论上2^25种),则当F(R)=F(L-1)时,即R,L-1点处的状态相同时(异或判断),这[L,R]是偶串。这样的话,我们可以遍历字符串,记录不同状态出现的次数(状态太多使用map)。统计完后,对于不同状态出现的次数(假设为n次),那么这种状态下的偶串次数可以轻易得到1+2+…+(n-1)。其实,在代码编写中可以把偶串计算次数融合到状态统计过程中去。

重点是:用26位表示不同状态,状态对于偶串的影响,以及计算状态后偶串数量。编码不难,思路重要。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
int main(){
 char data[100005];
 scanf("%s",data);
 int n=strlen(data);
 map<int,int> mp;
 mp[0]=1;//初始状态,26个字母全为偶数次状态为1
 int status=0;
 long long res=0;
 for(int i=0;i<n;i++){
    int x=data[i]-'a';
     status^=(1<<x);
     res+=mp[status];//这句很好,每种状态下的偶串累加。思考时可以把这行代码省略,想通后累加部分通过这句实现。
     mp[status]++;//统计不同状态出现的次数
 } 
 cout<<res<<endl;
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Verilog是一种硬件描述语言,它可以用来设计数字电路,其中也包括串口电路。在串口电路中,偶校验是一种常见的校验方式。 偶校验是指在传输数据时,传输的每个字节都有一个附加的“校验位”,该校验位的值由这个字节中所有1的个数来决定,如果发现1的个数为偶数,那么校验位就被设置为0,否则就被设置为1。在接收端,接收到数据时会重新计算校验位,并且验证接收到的数据是否正确。 在Verilog中,可以使用If语句来实现偶校验。例如: reg [7:0] data_in; // 表示传输的字节 reg parity; reg [7:0] data_out; always @(posedge clk) begin // 计算传输数据的校验位 integer i, count = 0; for(i = 0; i < 8; i = i + 1) begin if(data_in[i] == 1'b1) begin count = count + 1; end end if(count % 2 == 0) begin parity = 1'b0; // 偶校验,校验位为0 end else begin parity = 1'b1; // 偶校验,校验位为1 end // 将传输数据和校验位打包成一个字节 data_out = {data_in, parity}; end 因此,在Verilog中实现串口的偶校验,可以通过计算传输数据中1的个数来确定校验位的值,并将它和传输数据打包成一个字节。这样,在接收端就可以验证数据是否正确。 ### 回答2: Verilog是一种硬件描述语言,它被广泛用于数字电路和系统级设计。串口通信是一种常见的通信方式,它可以将数据从一个设备传输到另一个设备。在串口通信中,常用的校验方式有奇偶校验、偶校验和无校验。 Verilog中的串口模块通常会支持多种校验方式,包括偶校验。偶校验是一种校验方式,它在传输数据之前将数据位进行处理,使得数据位中1的个数为偶数。然后,在接收端,接收到的数据位将进行相同的处理,并比对是否符合偶校验规则。如果不符合,则说明传输过程中出现了错误,需要重新传输数据。 使用Verilog设计串口模块,可以通过简单的修改代码实现各种校验方式,包括偶校验。偶校验在硬件电路设计中具有重要意义,可以保证数据传输的准确性,提高了系统的可靠性和稳定性。因此,在设计串口通信模块时,对各种校验方式的理解和掌握是十分必要的。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值