WA 75pts:
#include <iostream>
#include <vector>
#include <string>
#define err '~'
#define int long long
using namespace std;
const int MAXN = 10e6 + 7;
char a[MAXN];
int dp[MAXN], can[MAXN], cnt;
void go_work(string inp)
{
int n = inp.size();
a[0] = err;
for (int i = 1; i <= n; i++) a[i] = inp[i - 1];
// a[n + 1] = '#';
for (int i = 1, mid = 0, maxr = 0; i <= n; i++)
{
if (i <= maxr) dp[cnt + i] = min(dp[cnt + 2 * mid - i], maxr - i + 1);
while (a[i - dp[cnt + i]] == a[i + dp[cnt + i]]) dp[cnt + i]++;
if (i + dp[cnt + i] - 1 >= maxr) maxr = i + dp[cnt + i] - 1, mid = i;
}
can[n] = true;
for (int i = n; i >= 1; i--)
{
if (i + dp[cnt + i] - 1 == n) can[cnt + i] = true;
else if (i == dp[cnt + i]) can[cnt + i] = can[cnt + i + dp[cnt + i] - 1];
else can[cnt + i] = false;
}
for (int i = 1; i <= n; i++) if (can[cnt + i]) cout << i << ' ';
cout << endl;
cnt += 2 * n;
}
signed main()
{
int t;
cin >> t;
while (t--)
{
string inp; cin >> inp;
go_work(inp);
}
}
AC 100pts:
#include <iostream>
#include <vector>
#include <string>
#define err '~'
#define int long long
using namespace std;
const int MAXN = 10e6 + 7;
char a[MAXN];
int dp[MAXN], can[MAXN], cnt;
void go_work(string inp)
{
int n = inp.size();
a[0] = err;
for (int i = 1; i <= n; i++) a[i] = inp[i - 1];
a[n + 1] = '#';
for (int i = 1, mid = 0, maxr = 0; i <= n; i++)
{
if (i <= maxr) dp[cnt + i] = min(dp[cnt + 2 * mid - i], maxr - i + 1);
while (a[i - dp[cnt + i]] == a[i + dp[cnt + i]]) dp[cnt + i]++;
if (i + dp[cnt + i] - 1 >= maxr) maxr = i + dp[cnt + i] - 1, mid = i;
}
can[n] = true;
for (int i = n; i >= 1; i--)
{
if (i + dp[cnt + i] - 1 == n) can[cnt + i] = true;
else if (i == dp[cnt + i]) can[cnt + i] = can[cnt + i + dp[cnt + i] - 1];
else can[cnt + i] = false;
}
for (int i = 1; i <= n; i++) if (can[cnt + i]) cout << i << ' ';
cout << endl;
cnt += 2 * n;
}
signed main()
{
int t;
cin >> t;
while (t--)
{
string inp; cin >> inp;
go_work(inp);
}
}