字尾自動機+序列自動機
分別建出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 的,不得不說題目的...