poj 3376 擴充套件kmp求回文加字典樹

2021-07-14 18:59:59 字數 1219 閱讀 7363

回文串的性質 : 它的每個字首都是它的字尾,

正序串和反序串kmp得字尾回文串的各個長度

反序串和正序串kmp得字首回文串的各個長度

kmp求出所有串的字首回文串和字尾回文串然後把正序串依次存入字典樹,然後列舉反序串進行查詢與字典樹上的串進行匹配得出結果。

坑了兩個晚上

#include

#include

#include

#define ll long long

#define maxn 2000005

using

namespace

std;

struct nodeno[maxn];

struct str;

str(){};

};vector

ve;int fla[maxn][2],nexta[maxn],tot = 0,n,pre,l;

char s[maxn],t[maxn];

void getnext(char *a,int la)

else j = nexta[j];

}}void kmp(int flag,char *a,char *b,int la,int start)//0字首 1字尾

else j = nexta[j];

}if(flag==0)//字首

}else

}}void inserttire(int pre,char *a,int start,int la)//儲存字首

else pre = no[pre].son[a[i]-'a'];

if(i+1

1][1];

}no[pre].sum++;

}ll findtire(int start,int en,int pre)

}else

}if(sym)ans+=no[pre].cnt;

return ans;

}int main()

getnext(s+pre,l);

kmp(0,s+pre,t+pre,l,pre);

getnext(t+pre,l);

kmp(1,t+pre,s+pre,l,pre);

inserttire(0,s+pre,pre,l);

pre+=l;

}for(int i=0;i0);

printf("%i64d\n",ans);

}

Poj 3376(擴充套件KMP,Trie)

2014 12 18 00 22 30 思路 這題目好想不好做 事實上能想到就不容易了 看了題解的思路.然後自己敲的。考慮 把所有正串都加進一棵trie,然後用每個串的逆串去跑trie,此時會出現兩種情況 1 匹配完成,那麼就說明存在乙個正串的字首是這個逆串。如果剩餘的逆串回文,那麼能形成回文。2 ...

poj3376 字典樹 擴充套件kmp

kuangbin專題十六字最後一發 題意 n個字串,每個字串長度為l,將字串兩兩自由組合一共有 n n種方案 判斷其中組合之後為回文串的字元有多少個.做法 首先由兩個字串a,b.要使它們能組成回文串有三種情況 1.alen blen 時 a是b的反串字首,且b的剩餘部分可以認為是字尾是回文串 2.a...

POJ 2752 (擴充套件kmp)

給你乙個字串,對於它的每乙個字首,如果同時是它的字尾的話,那麼輸出這個字首的位置。擴充套件kmp求一下next陣列,然後掃一遍每個位置,如果這個位置的next值 也就是這個位置的字尾和字首的最大匹配長度 是等於字尾長度的話,也就是說這個位置的字尾同時也是它的字首的話,那麼這個位置就是乙個答案。inc...