【求助】 关于字符串读入
  • 板块学术版
  • 楼主LunarArc
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/6/6 15:50
  • 上次更新2023/11/4 22:14:29
查看原帖
【求助】 关于字符串读入
95692
LunarArc楼主2021/6/6 15:50

P3375 【模板】KMP字符串匹配

这道题在字符串输入的时候,用这种方式

	len1=len2=1;
	while((s1[len1]=getchar())!='\n') len1++;len1--;
	while((s2[len2]=getchar())!='\n') len2++;len2--;

和这种方式

cin>>s1+1; len1=strlen(s1+1);
cin>>s2+1; len2=strlen(s2+1);

在本地输出结果一样,但第一种全WA,第二种就Accepted

这两种有什么区别吗?

附全部代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define rg register
typedef long long ll;
using namespace std;
inline int sread()
{
	int x=0,f=1;char c=getchar();
	while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
	return f*x; 
}
const int maxn=1000050;
int len1,len2;
char s1[maxn],s2[maxn];//s1母串 s2子串 
int next[maxn],f[maxn]; 
int main()
{
//	len1=len2=1;
//	while((s1[len1]=getchar())!='\n') len1++;len1--;
//	while((s2[len2]=getchar())!='\n') len2++;len2--;
	cin>>s1+1; len1=strlen(s1+1);
	cin>>s2+1; len2=strlen(s2+1);
	for(rg int i=2,j=0;i<=len2;i++)
	{
		while(j>0&&s2[i]!=s2[j+1]) j=next[j];
		if(s2[i]==s2[j+1]) j++;
		next[i]=j;
	}
	for(rg int i=1,j=0;i<=len1;i++)
	{
		while(j>0&&(j==len1||s1[i]!=s2[j+1])) j=next[j];
		if(s1[i]==s2[j+1]) j++;
		f[i]=j;
		if(f[i]==len2) {printf("%d\n",i-len2+1);j=next[j];} 
	}
	for(rg int i=1;i<=len2;++i)
	{
		printf("%d ",next[i]);
	}
	return 0;
}
2021/6/6 15:50
加载中...