您的位置:首页 > 其它

南阳理工学院OJ - 0005 - Binary String Matching

2017-12-22 23:13 375 查看
题目给出n组01字符串,每组字符串有A,B两个,len_A<=10,len_B<=1000,求B中与A相同的字串个数。

C++做法:

用String头文件中的compare函数即可

#include <iostream>
#include <string>
using namespace std;
int main(){
int n,i,j,lena,lenb,cnt;string A,B;
cin>>n;
for(i=0;i<n;i++){
cin>>A>>B;
lena=A.length();lenb=B.length();cnt=0;
for(j=0;j<=lenb-lena;j++){
if(B.compare(j,lena,A)==0)cnt++;
}
cout<<cnt<<endl;
}
}


C语言做法:

既然是01字符串,我们很容易地就能想到位运算操作。那么对区间的移动:

string[a,a+len−1]→string[a,a+len]→string[a+1,a+len]

有:

c=((c<<1)&~(1<<lena))+B[j]-'0'//c为区间的01字符串代表的二进制数


即将c左移一位与11110111111与运算,0是第len位,再加上新进入区间的字符

#include <stdio.h>
#include <string.h>
using namespace std;
char A[15],B[1005];
int main(){
int n,i,j,a,c,lena,lenb,cnt;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s%s",A,B);
lena=strlen(A);lenb=strlen(B);
if(lenb<lena)printf("0\n");
else{
j=a=c=0;
while(j<lena){
a=(a<<1)+A[j]-'0';
c=(c<<1)+B[j++]-'0';
}
cnt=(a==c);
for(j=lena;j<lenb;j++)cnt+=(a==(c=((c<<1)&~(1<<lena))+B[j]-'0'));
printf("%d\n",cnt);
}
memset(A,0,sizeof(A));memset(B,0,sizeof(B));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: