HEOI2015 最短不公共子串

2021-10-01 12:28:53 字數 1288 閱讀 2021

字尾自動機+序列自動機

分別建出a,b兩個串的字尾自動機和序列自動機,然後因為字尾自動機和序列自動機都是dag,所以在上面dp一下就可以啦

dp[ i ][ j ]表示在第乙個狀態的自動機上匹配到 i 號節點,在第二個狀態的自動機上匹配到 j 號節點時  還需要新增dp[ i ][ j ]個字元才能使兩串失配(滿足條件) ,這個記憶化搜尋一下就好了

複雜度:o(n+n*n)

#include #include #include #include using namespace std;

const int inf=1e9+10;

const int maxn=1e4+10;

struct suda

po[maxn];

int las,tot;

void init()

void insert(int x)

}}}sam[3];

struct xuda

po[maxn];

int lc[30];

void init()

void build(char *s,int n) }

}xum[3];

int lena,lenb,ans;

char a[maxn],b[maxn];

int dp[4010][4010];

int solve1(int x,int y)

else if (sam[1].po[x].ch[i] && !sam[2].po[y].ch[i]) now=1;

dp[x][y]=now;

return dp[x][y];

}int solve2(int x,int y)

else if (sam[1].po[x].ch[i] && !xum[2].po[y].ch[i]) now=1;

dp[x][y]=now;

return dp[x][y];

}int solve3(int x,int y)

else if (xum[1].po[x].ch[i] && !sam[2].po[y].ch[i]) now=1;

dp[x][y]=now;

return dp[x][y];

}int solve4(int x,int y)

else if (xum[1].po[x].ch[i] && !xum[2].po[y].ch[i]) now=1;

dp[x][y]=now;

return dp[x][y];

}int main()

HEOI2015 最短不公共子串

在虐各種最長公共子串 子串行的題虐的不耐煩了之後,你決定反其道而行之。下面給出一些定義 下面,給兩個小寫字母串 a,ba,b,請你計算 a 的乙個最短的子串,它不是 b 的子串。a 的乙個最短的子串,它不是 b 的子串行。a 的乙個最短的子串行,它不是 b 的子串。a 的乙個最短的子串行,它不是 b...

bzoj4032 HEOI2015 最短不公共子串

字尾自動機 序列自動機 序列自動機這東西好像很高階的樣子。其實很簡單的啦。詳細可以看一下我的部落格序列自動機 對字串a構建字尾自動機 str a 和序列自動機 seq a 類似地,對字串b也構建字尾自動機 str b 和序列自動機 seq b 然後對於4個詢問我們分別拿出1個自動機,如第乙個詢問拿出...

HEOI2015 定價 (貪心)

先說一下我對這個題目的態度 首先這一題是貪心,這個十分明顯,看了一眼其他題解都是十分優秀的貪心,可是大家都沒有想過嗎 你們貪心都是在區間 l,r 上列舉的貪心,雖然每一次可以直接加上 10 的階乘,但你們畢竟是用的 int long long 啊!這一題得正解複雜度是 log n 的,不得不說題目的...