題意:
求多個串<=10的最長連續子串
乙個串建sam,然後其他串在上面走
每個狀態記錄所有串在這個狀態的公共子串的最小值
乙個串在上面走的時候記錄與每個狀態公共子串的最大值,注意出現次數向父親傳遞,乙個狀態能到達說明了suffix link指向的狀態可以取到最大子串,這一步對val後基數排序然後倒著更新就行了
注意兩點:
1.空間要開兩倍,基數排序用的東西也要兩倍哦
2.答案不能用mn[1]更新!!!!因為mn[1]沒有意義啊root狀態乙個子串也沒有還可能有某些bug
#include #include#include
#include
using
namespace
std;
const
int n=2e5+5
;int
n,m;
char
s[n];
struct
statet[n
<<1
];int
sz,root,last;
inline
int nw(int _)
void inisam()
void extend(int
c) }
last=np;
}int mx[n<<1],mn[n<<1
];void walk(char
s) }
}int c[n<<1],a[n<<1
],ans;
void radixsort(int
len)
void
solve()
}for(int i=2;i<=sz;i++) ans=max(ans,mn[i]);
printf("%d
",ans);
}int
main()
SPOJ1812 LCS2 字尾自動機
並沒有什麼想說的,但是要保持格式 w spoj lcs2傳送門 給出n個字串 n不超過10,每個串長不超過100000 求出這n個字串的最長公共子串 tip 子串是連續的,子串行是不連續的 輸入格式 一共n行,每行包含乙個字串 輸出格式 輸出一行乙個整數,表示最長公共子串 這是一道字尾自動姬的基礎應...
SPOJ 1812 LCS2 字尾自動機 DP
題意 求多個串 10的最長連續子串 乙個串建sam,然後其他串在上面走 每個狀態記錄所有串在這個狀態的公共子串的最小值 乙個串在上面走的時候記錄與每個狀態公共子串的最大值,注意出現次數向父親傳遞,乙個狀態能到達說明了suffix link指向的狀態可以取到最大子串,這一步對val後基數排序然後倒著更...
SPOJ 1811 LCS 字尾自動機
題意 求兩個串的最大連續子串 乙個串建sam,另乙個串在上面跑 注意如果走了suffix link,sum需要更新為t u val 1 suffix link有點像失配吧,當前狀態s走不了了就到suffix link指向的狀態fa上去,fa是s的字尾所以是可行的,並且有更多走的機會 include ...