My Solution
题意:给出一个字符串要求找出多少对有相交部分的回文子串。
回文自动机+邻接表
首先,直接求这个问题比较麻烦,故可以转化为总的回文子串的对数减掉不相交的回文子串的对数。
故先预处理出suml[i]表示从左到到,0~i-1内的回文子串的个数,
然后倒的再建一个自动机,每次 lesr = num[last]表示插入这个字符以后以这个字符结尾的回文子串的个数,然后 suml[i] * lesr就是此时的不相交的回文子串的对数,
然后对于每个i都求出不相交的回文子串的对数,然后总对数减去这个即可。
之后就是超内存的问题了,nxt[MAXN][CHAR_SIZE]太大了,本来没有注意,超内存了以后算了一下原始的自动机需要200多MB内存,但这里只给了100多MB,
然后试了 map<pair<int, int>, int> nxt;然后超时了(┬_┬),
后来算了下用map之后变成了O(nlogn),但这里n比较大有2e6,所以nlogn大概不算其它常数就有4e7,确实超时,所以要几乎O(n)才行。
所以上了邻接表,虽然不快,但比map要快,比普通的nxt[MAXN][CHAR_SIZE]省了很多内存。
复杂度 略大于O(n)
#include
#include
#include
#include
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
共有 0 条评论