貼一題:
題意: 輸入乙個人字串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 思路 序列自動機其實就是先預處理出來乙個...