这道题在字符串输入的时候,用这种方式
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;
}