P4173残缺的字符串
心得:
这道题,我觉得是不难的,代码逻辑很清晰,但是提交就是有问题
最后发现两个问题:
scanf输入字符后要用getchar() 吞回车 !!!!(天坑
用 scanf 输入时,不管输入什么,最后“敲”的回车都会被留在缓冲区,这里也不例外。输入字符串时最后“敲”的回车也会被留在缓冲区,如果紧接着要给一个字符变量赋值的话,那么还没等你输入系统就自动退出来了。因为系统自动将回车产生的字符 '\n' 赋给该字符变量了,所以此时对字符变量赋值前要首先清空缓冲区。
2.在位置1处忘了continue,导致已经确定一次相等之后l=2
(今天洛谷崩了没办法评测,但我相信应该是能AC的,埋个坑。
竟然g了,果然菜鸟就是菜鸟
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int m,n;
char a[N];
char b[N];
int arr[N];
int cnt;
int main()
{
scanf("%d %d",&m,&n);
getchar();
for(int i=1;i<=m;i++)
{
scanf("%c",&a[i]);
}
getchar();//加了getchar()运行结果都不一样,可见getchar的重要性
for(int i=1;i<=n;i++)
{
scanf("%c",&b[i]);
}
int l=1;
for(int i=1;i<=n;i++)//遍历b的每一个位置
{
if(b[i]==a[l]||b[i]=='*'||a[l]=='*')
{
if(l==m)//完成了一次
{
arr[i+1-l]=1;
cnt++;
l=1;//完成后l要复原
continue; //1
}
l++;
}else{
l=1;
}
}
printf("%d\n",cnt);
if(cnt>0)
for(int i=0;i<N;i++)
{
if(arr[i]!=0)
{
printf("%d ",i);
}
}
return 0;
}
点开题解都是我不会的东西(copy一下大佬的说法,埋个坑
字符串匹配有三种方式:
哈希
KMP/Z
FFT