HDU 6599 I Love Palindrome String (回文树+hash)
题意
找如下子串的个数:
(l,r)是回文串,并且(l,(l+r)/2)也是回文串
思路
本来写了个回文树+dfs+hash,由于用了map所以T了
后来发现既然该子串和该子串的前半部分都是回文串,所以该子串的前半部分和后半部分是本质相同的!
于是这个log就去掉了
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1using namespace std;typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 8e5+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);const ull base = 201326611;ull po[maxn],ha[maxn];ull getHash(int l, int r){return ha[r]-ha[l-1]*po[r-l+1];
}
int ans[maxn];
int id[maxn];
struct pam{int nx[maxn][26],num[maxn],cnt[maxn],fail[maxn];int len[maxn],s[maxn],p,lst,n;int newNode(int x){mem(nx[p],0);cnt[p]=num[p]=0;len[p]=x;return p++;}void init(){p=0;newNode(0);newNode(-1);lst=0;n=0;s[0]=-1;fail[0]=1;}int getFail(int x){while(s[n-len[x]-1]!=s[n])x=fail[x];return x;}void add(int x){x-='a';s[++n]=x;int cur=getFail(lst);if(!(lst=nx[cur][x])){//产生新节点int now = newNode(len[cur]+2);fail[now]=nx[getFail(fail[cur])][x];nx[cur][x]=now;num[now]=num[fail[now]]+1;lst=now;id[now]=n;}cnt[lst]++;}void count(){for(int i = p-1; i >= 0; i--)cnt[fail[i]]+=cnt[i];for(int i = 2; i < p; i++){int l = id[i]-len[i]+1;int r = id[i];int mid = (l+r)>>1;if(len[i]%2==1&&getHash(l,mid)==getHash(mid,r))ans[len[i]]+=cnt[i];if(len[i]%2==0&&getHash(l,mid)==getHash(mid+1,r))ans[len[i]]+=cnt[i];}}
}pam;
int n;
char s[maxn];
int main(){po[0]=1;for(int i = 1; i <= 3e5+10; i++){po[i]=po[i-1]*base;}while(~scanf("%s",s+1)){n=strlen(s+1);pam.init();for(int i = 1; i <= n; i++){ans[i]=0;ha[i]=ha[i-1]*base+s[i]-'a'+1;pam.add(s[i]);}pam.count();for(int i = 1; i <= n; i++){printf("%d", ans[i]);if(i!=n)printf(" ");}printf("\n");}return 0;
}
/**/
转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/11516714.html
HDU 6599 I Love Palindrome String (回文树+hash)相关推荐
- HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash)
题目链接 题意 一个长度为3e5的字符串,求长度为iii的字符串满足字符是回文串而且字符串的前一半也是回文串的个数 思路 回文数求出所有的回文字符串,然后用Manacher或者Hash判断是否符合条件 ...
- HDU6599I Love Palindrome String 回文树+哈希
点我看题 题意: 给出一个长度为N的字符串,要求输出一个长度为N的数组A, A[i]表示长度为i的good substring的数量 good substring 的定义是 该子串是回文串,且该子串的 ...
- HDU 6599:I Love Palindrome String Manacher+回文自动机
题意 Problem Description You are given a string S=s1s2-s|S| containing only lowercase English letters. ...
- hdu 6599(回文树+hash)
题目 思路:先建好一棵回文树,然后问题就是如何快速判断一个结点代表的回文串是不是题目要求的回文串,暴力判断就是顺着后缀链接找,然后就T了 emmm.而实际上在插入一个结点时,这个代表的回文串我们可以通 ...
- I Love Palindrome String HDU - 6599 回文树+hash
题意: 输出每个长度下的回文串(这些回文串的左半边也需要是回文串) 题解: 直接套上回文树,然后每找到一个回文串就将他hash. 因为符合要求的回文串本身是回文串,左半边也是回文串,所以它左半边也右半 ...
- HDU - 5157 Harry and magic string(回文自动机)
题目链接:点击查看 题目大意:给出一个字符串 s ,问字符串 s 中有多少对回文子串(x,y),意思就是子串 x 和子串 y 都是回文串,且不相交(不重叠) 题目分析:可以正着跑一遍回文自动机,用一个 ...
- 【题解】HDU6599 I Love Palindrome String 回文自动机
补一下多校里碰到的字符串题. 来源:2019 HDU Multi-University Training Contest 2 - 09 给定一个字符串S,对于每个i,输出有多少个子串s[l,r]满足以 ...
- hdu 6599 I Love Palindrome String hash+PAM
题意 给一个字符串,让我们找每个长度的子串中,是super串的个数.(类似双倍回文) 分析 我们对原串建立一个PAM,这样我们可以统计每种回文串出现次数,在用hash判断是不是super串 最后在统计 ...
- 2019牛客暑期多校训练营(第六场)C - Palindrome Mouse (回文树dfs)
题目链接 题意 一个字符串,求有多少对(S,T)(S,T)(S,T),满足S.TS.TS.T是回文串,S是T的子串S是T的子串S是T的子串 思路 题解还没看懂- 看大佬代码,好多在回文树上dfsdfs ...
- HDU2019多校第二场 1009(HDU 6599) I Love Palindrome String(回文树(自动机)+manacher)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 解题思路: 回文自动机求每个本质不同的子串出现的次数,同时记录每个节点i代表的回文串第一次出现的 ...
最新文章
- Python爬虫框架Scrapy 学习笔记 6 ------- 基本命令
- 茫茫内存,我该如何用 windbg 找到你 ?
- Python 数据分析三剑客之 Pandas(八):数据重塑、重复数据处理与数据替换
- 服务器改用ssh文件登录
- 不重复的两两比较(洛谷P5728题题解,Java语言描述)
- 怎么打开jsp文件目录_ppt转换成pdf怎么转?我选择这个办法
- spring mvc实例
- 经验分享|测试工程师转型测试开发历程
- 没有基础的人可以学python吗-今天就来告诉你,没有编程基础的人适不适合学python...
- java 锁优化_Java中锁优化
- NBIOT的BC26使用
- java 假设检验_据说假设检验是个很难的题
- Hololens开发笔记
- 游戏数据库版本更新神器Flyway
- yolo系列学习(入门经过)
- 视频号带货玩法拆解,无私分享给有需要的你「视频教程」
- 推荐一款免费又好用的报表工具
- Excel的写入和读操作,以及.xls和.xlsx文件的区别
- git clone 使用账号密码 windows
- layui table 导出excel 兼容IE浏览器