社区讨论

关于输入

P3805【模板】Manacher参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi5u8acj
此快照首次捕获于
2025/11/19 18:06
3 个月前
此快照最后确认于
2025/11/21 00:01
3 个月前
查看原帖
为什么 scanf 和 getchar() 会得到完全不一样的结果。
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int M=11000005;

char a[M<<1];

int id[M<<1];

int main(){
	
	int n=0,ans=0;
	
	char ch='b';
	a[0]='~';
	a[++n]='|';
	
	while(ch>='a'&&ch<='z'){
		ch=getchar();
		a[++n]=ch;a[++n]='|';
	}
	
	int l=1,r=0,mid=0;
	
	for(;l<=n;l++){
		if(l<=r)id[l]=min(id[(mid*2)-l],r-l+1);
		while(a[l+id[l]]==a[l-id[l]]){
			id[l]++;
		}
		if(id[l]+l>r){
			r=id[l]+l-1,mid=l;
		}
	}
	
	for(int i=1;i<=n;i++){
		ans=max(ans,id[i]);
	}
	
	printf("%d",ans-1);
	
	return 0;
}


会 ac
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int M=11000005;

char a[M<<1];

int id[M<<1];

int main(){
	
	int n=0,ans=0;
	
	char ch='b';
	a[0]='~';
	a[++n]='|';
	
	while(ch>='a'&&ch<='z'){
		scanf("%c",&ch);
		a[++n]=ch;a[++n]='|';
	}
	
	int l=1,r=0,mid=0;
	
	for(;l<=n;l++){
		if(l<=r)id[l]=min(id[(mid*2)-l],r-l+1);
		while(a[l+id[l]]==a[l-id[l]]){
			id[l]++;
		}
		if(id[l]+l>r){
			r=id[l]+l-1,mid=l;
		}
	}
	
	for(int i=1;i<=n;i++){
		ans=max(ans,id[i]);
	}
	
	printf("%d",ans-1);
	
	return 0;
}

为什么会 re 52 分?
以前一直没考虑过,所以就问一下。(没研究过这些输入的原理,菜但是别喷)

回复

2 条回复,欢迎继续交流。

正在加载回复...