分析
- 给我们一个s,让我们判读相同长度的 前缀和后缀子串的长度有哪些,从小到大输出这些长度
- 预处理字符串的hash值,暴力枚举长度,通过hash值判读相同
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void fre() { system("clear"), freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
void Fre() { system("clear"), freopen("A.txt", "r", stdin);}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define db double
#define Pir pair
#define m_p make_pair
#define INF 0x3f3f3f3f
#define esp 1e-7
#define mod (ll)(1e9 + 7)
#define for_(i, s, e) for(int i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(int i = (ll)(e); i >= (ll)(s); i --)
#define sc scanf
#define pr printf
#define sd(a) scanf("%d", &a)
#define ss(a) scanf("%s", a)
using namespace std;
const int mxn = 400005;
char s[mxn];
ull hs[mxn];
ull bse[mxn];
ull bsc = 31;
void init()
{
bse[0] = 1;
for_(i, 1, mxn - 1)
bse[i] = bse[i - 1] * bsc;
}
int main()
{
init();
while(ss(s) != EOF)
{
int n = strlen(s);
hs[n] = 0;
rep_(i, n - 1, 0)
hs[i] = hs[i + 1] * bsc + s[i] - 'a';
for_(i, 0, n - 1)
if(hs[0] - hs[i + 1] * bse[i + 1] == hs[n - i - 1])
pr("%d ", i + 1);
pr("\n");
}
return 0;
}