#4
查看原帖
#4
610865
ZheyuHarry楼主2022/9/2 16:23

wrong answer On line 4 column 1, read 9, expected 6.

#include<bits/stdc++.h>

using namespace std;

const int N = 2e7 + 10;

char str[N];
string s;
int len;
int d[N];
bool ans[N];

void init()
{
	str[0] = '#';
	int j = 1; 
	for(int i = 0; i < s.size(); i ++)
	{
		str[j ++] = s[i] , str[j ++] = '#';
	}
}

void manacher()
{
    memset(ans , false , sizeof ans);
	for(int i = 0, l = 0 , r = -1;  i < len; i ++)
	{
		int k = (i > r) ? 1 : min(d[l + r - i] , r - i + 1);
		while(i - k >= 0  && i + k < len && str[i - k] == str[i + k]) k ++;
		d[i] = k --;
		if(i + k > r)
		{
			r = i + k;
			l = i - k;
		}
	}
}

void solve()
{
	cin >> s;
	init();
	len = strlen(str);
	manacher();
	ans[s.size()] = true;
	for(int i = s.size() - 1; i >= 0; i --)
	{
	    int ri = d[i * 2 + 1];
		if(ri > 1)
		{
		    ri = ri / 2 - 1;
		    if(ri + i + 1 == s.size()) ans[i + 1] = true;
		    if(ans[ri + i + 1] && i - ri == 0) ans[i + 1] = true;
		}
	}
	for(int i = 1; i <= s.size(); i ++) 
	    if(ans[i]) 
	        printf("%d " , i);
	printf("\n");
}

int main()
{
	int t;
	scanf("%d" , &t);
	while(t --)
	{
		solve();
	}
	return 0;
}
2022/9/2 16:23
加载中...