求助Manacher
查看原帖
求助Manacher
394991
Sharing666楼主2021/8/23 18:48

样例过不了

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int t,r,mid,cnt,p[3000002];
char a[1000002],c[3000002];
bool mark[3000002];

void read() {
	char ch=getchar();
	while(ch<'a' || ch>'z') ch=getchar();
	while(ch>='a' && ch<='z') {
		ch=getchar();
		c[++cnt]=ch;
		c[++cnt]='#';
	}
}

void manacher() {
	c[0]='~';
	c[1]='#';
	cnt=1;
	read();
	c[cnt+1]='%';
	r=mid=0;
	for(int i=1;i<=cnt;i++) {
		p[i]=0;
		if(i<=r) p[i]=min(p[mid*2-i],r-i+1);
		while(c[i-p[i]]==c[i+p[i]]) p[i]++;
		if(i+p[i]-1>r) {
			r=i+p[i]-1;
			mid=i;
		}
	}
}

int main() {
	scanf("%d",&t);
	while(t--) {
		manacher();
		memset(mark,0,sizeof(mark));
		for(int i=cnt;i;i--) {
			if(i+p[i]-1==cnt) mark[i]=1;
			else if(i-p[i]+1==1 && mark[i+p[i]-2]) mark[i]=1;
		}
		for(int i=2;i<=cnt;i+=2) 
			if(mark[i]) printf("%d ",i/2);
		printf("\n");
	}
	return 0;
}
2021/8/23 18:48
加载中...