子串行自動機

2022-02-28 14:04:01 字數 1492 閱讀 3622

貼一題:

題意:  輸入乙個人字串a,再輸入乙個字串b,                     問b是否是a的子串行,是則輸出yes,否則輸出no。

思路:暴力肯定是會超時的,既然時間會超,那麼只能用空間換時間,採用乙個比較冷門的演算法      ----------------------->    子串行自動機。

子串行自動機適合於字串中的字元種類數偏少,且已知。  

思路很簡單,假設   主序列   為       「abcade」    

建立乙個二維陣列    dis【max】;   //  此處的30是字元種數,  這裡是字元取         'a'    ~   'z'         種數是   26。

直接輸出dis陣列,那你就懂了。

對於   「abcade」       對於dis陣列,假設dis[i][j]  為-1,說明    ascii值為  'a'+j    的字元,在位置   >= i   之後不存在。

如果為非-1,假設為整數  b      ,         同理,該字元,在位置   >=i   之後最近的為位置 b

附上**:

#include#include

#include

#include

#include

#include

#include

#include

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)

#define mem0(x) memset(x,0,sizeof(x))

#define mem1(x) memset(x,-1,sizeof(x))

#define memx(x) memset(x,0x3f,sizeof(x))

using

namespace

std;

typedef

long

long

ll;const

int inf=0x3f3f3f

;const

int max=1e6+10

; char

str1[max],str2[max];

int dfs[max][30],res[30

];int

main()

res[str1[i]-'

a']=i;

}while (n--)

tmp=dfs[tmp][str2[i]-'a'

]; }

if(flag)

printf(

"yes\n");

else

printf(

"no\n");

}return0;

}

序列自動機

昨天在牛客碰到了這樣的一道題,判斷一些字串是不是原串的子串行,因為之前做過一些lcs子串行的題,就想,這不賊簡單,用lcs求一下每個子串和原串,然後判斷lcs的長度是不是等於要判斷的那個串的長度,然後,t了,因為dp求lcs幾個串還好說,但是當串又多又長時,不僅會t,dp陣列不弄滾動陣列還會mle,...

字尾自動機 序列自動機綜合

好像序列自動機還沒有寫過 串長為n的串共有n 1個節點,除了串中的n個節點,還有乙個空的根節點放在串首。每個節點至多有26條出邊,每條邊連向它之後的第乙個字元。串中的任意乙個子串行對應了一條根到某個節點的路徑。且每條路徑對應乙個不同的子串行。每個節點的parent是這個字母上一次出現的位置。更新只要...

序列自動機 模板

南昌邀請賽網路賽m題 subsequence 題意 給你乙個字串s,長度小於1e5,然後n次詢問,n小於1e5,每次輸入乙個字串t,問t是不是s的子串行。t長度小於1000 input abcdefg 3abc adgcba output yes yesno 思路 序列自動機其實就是先預處理出來乙個...