題面傳送門
題意:給出兩個$n=250000$的字串,求最長公共子串。
思路:把第乙個字串放到sam裡面去。
對於第二個串,能匹配則匹配,不能匹配就跳回能匹配的位置,如果乙個都不能匹配,則cur要重新初始化為root。
對字尾自動機的理解還比較模糊,怕誤人子弟,此題就不做詳述。
#include#define clr(a,b) memset(a,b,sizeof(a))using
namespace
std;
typedef
long
long
ll;const
int maxn=250010*2
;char
s1[maxn],s2[maxn];
int len1,len2,len[maxn],tot=1,root=1,last=1,ch[maxn][27
],fa[maxn];
void extend(int
x)
if(!pre)fa[now]=root;
else}}
} int
main()
int maxx=0,cur=root,ans=0
;
for(int i=0;imax(maxx,ans))
while(cur&&ch[cur][p]==0
)
if(cur)
else
}printf(
"%d\n
",ans);
}
spoj LCS 字尾自動機
琦不會字尾自動機 是以前太浪了 所以所有東西都留到了noi前來學 馬上狗牌退役了tat 心塞qwq 題目大意 給出兩個串a,b,求a b的最長公共子串 對a建字尾自動機,然後用b去匹配,若能匹配上就轉移到兒子,否則沿著parent樹向上跳 include include include includ...
SPOJ LCS2 字尾自動機
題意 求多個串的lcs 思路 跟上題一樣的東西 只不過多加乙個臨時的dp陣列來儲存所有的狀態的最小值 然後求所有子串的最大值就好了 include include include include include include include include include include incl...
SPOJ LCS2 字尾自動機
給多個字串,問最長公共子串。最長公共子串用字尾自動機還是很方便的,首先的話,有乙個非常重要的字尾自動機性質一定要明確,字尾自動機乙個點的par一定是這個點代表的所有字元子串的公共字尾。了解了這一點,我們便可以構造字尾自動機,然後進行匹配。在匹配的過程中,如果可以成功轉移,直接轉移並且把記錄的長度 就...