【Manacher】绿绿和串串(luogu 5446)
生活随笔
收集整理的這篇文章主要介紹了
【Manacher】绿绿和串串(luogu 5446)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
luogu 5446
題目大意
定義對折為:以最后一個字符為對稱軸翻轉
問你一個字符串可能是由那些前綴對折若干次而來的
解題思路
先用Manacher求出回文長度
那么滿足以下條件之一的前綴就是可行方案
最后一個字符的回文長度加上它的位置為n(后面若干字符和前面滿足回文)
最后一個字符回文長度等于該字符串的長度,且對折后形成的字符串是可行方案
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 1000010 using namespace std; int t, n, s[N], l[N], p[N]; string str; void Manacher() {int mx = 0, mid = 0;for (int i = 1; i <= n; ++i){if (i < mx) l[i] = min(l[mid * 2 - i], mx - i);else l[i] = 1;while(s[i + l[i]] == s[i - l[i]]) l[i]++;if (i + l[i] > mx){mx = i + l[i];mid = i;}}return; } int main() {scanf("%d", &t);while(t--){cin>>str;n = str.size();s[0] = '#';for (int i = 1; i <= n; ++i)s[i] = str[i - 1];s[n + 1] = 0;Manacher();memset(p, 0, sizeof(p));for (int i = n; i > 0; --i)if (i + l[i] > n || p[i + l[i] - 1] && l[i] == i)//滿足條件p[i] = 1;for (int i = 1; i <= n; ++i)if (p[i])printf("%d ", i);putchar(10);}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【Manacher】绿绿和串串(luogu 5446)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宏碁推出创新笔记本电脑宏碁推出创新笔记本
- 下一篇: 【Manacher】【贪心】字符串连接(