mmxingye

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

14 | 字符串前后缀相等(字符串哈希巩固练习)

题目描述

给定若干由小写字母组成的字符串(这些字符串总长 ≤4×105),在每个字符串中求出所有既是前缀又是后缀的子串长度。

例如:ababcababababcabab,既是前缀又是后缀的:ab,abab,ababcabab,ababcababababcabab。

输入

输入若干行,每行一个字符串。

输出

对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。

样例

输入

ababcababababcabab
aaaaa

输出

2 4 9 18
1 2 3 4 5
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int N=4e5 + 10,P=131;
ULL h[N],p[N];
char s[N];
// 计算哈希
void gethash(){
int len=strlen(s+1);
p[0]=1;
for(int i=1;i<=len;i++){
p[i]=p[i-1]*P;
h[i]=h[i-1]*P+(s[i]-'a'+1);
}
}
//计算区间哈希值
ULL get(int l,int r){
return h[r]-h[l-1]*p[r-l+1];
}
int main(){
while(scanf("%s",s+1)!=EOF){
gethash();//对于字符串 S 计算滚动哈希值
// 遍历每种可能的长度
int len=strlen(s+1);
for(int i=1;i<=len;i++){
if(get(1,i)==get(len-i+1,len)) printf("%d ",i);
}
printf("\n");
}
return 0;
}

posted on   独立树  阅读(261)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示