一道比較簡單的題,結果自己腦補了各種奇葩(錯誤)的判斷,搞了乙個多小時。。。
題意:用已知字典去識別乙個串,求最長可識別字首(指能將此字首分解為字典裡面的單詞)
思路:建好ac自動機,記錄好每個點所代表的字串的長度
拿要匹配的串從前往後匹配,若某個點完全不能匹配,直接退出(可以不考慮這個)
處理好什麼叫「可以匹配」就好了,就是能將當前串分解為乙個可識別的字首和乙個可識別的字尾即可
因此對當前字元跑fail邊(即跑字尾),若「可以匹配」,則更新最長可識別字首,並標記當前串(也是乙個字首)可識別
題目描述
標點符號的出現晚於文字的出現,所以以前的語言都是沒有標點的。現在你要處理的就是一段沒有標點的文章。
一段文章t是由若干小寫字母構成。乙個單詞w也是由若干小寫字母構成。乙個字典d是若干個單詞的集合。我們稱一段文章t在某個字典d下是可以被理解的,是指如果文章t可以被分成若干部分,且每乙個部分都是字典d中的單詞。
例如字典d中包括單詞,則文章『whatisyourname』是在字典d下可以被理解的,因為它可以分成4個單詞:『what』, 『is』, 『your』, 『name』,且每個單詞都屬於字典d,而文章『whatisyouname』在字典d下不能被理解,但可以在字典d』=d+下被理解。這段文章的乙個字首『whatis』,也可以在字典d下被理解,而且是在字典d下能夠被理解的最長的字首。
給定乙個字典d,你的程式需要判斷若干段文章在字典d下是否能夠被理解。並給出其在字典d下能夠被理解的最長字首的位置。
輸入格式
輸入檔案第一行是兩個正整數n和m,表示字典d中有n個單詞,且有m段文章需要被處理。之後的n行每行描述乙個單詞,再之後的m行每行描述一段文章。
其中1<=n, m<=20,每個單詞長度不超過10,每段文章長度不超過1m。
輸出格式
對於輸入的每一段文章,你需要輸出這段文章在字典d可以被理解的最長字首的位置。
輸入輸出樣例
輸入4 3
isname
what
your
whatisyourname
whatisyouname
whaisyourname
輸出14 (整段文章』whatisyourname』都能被理解)
6 (字首』whatis』能夠被理解)
0 (沒有任何字首能夠被理解)
//#pragma comment(linker, "/stack:102400000,102400000")
#include "bits/stdc++.h"
#define pb push_back
#define ls l,m,now<<1
#define rs m+1,r,now<<1|1
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)inline int read()
const int maxn = 1e3+10;
const int mod = 1e4+7;
const double eps = 1e-9;
char s[maxn*maxn];
int n, m;
int trie[maxn][26], fail[maxn], ed[maxn], cnt, sl[maxn];
bool vis[maxn*maxn];
void insert()
else trie[now][i]=trie[fail[now]][i];}}
}int match()
return mlen;
}int main()
}
洛谷P2292 L語言
題目大意 給定乙個長度為 n 的字串和乙個字典,字典中所有的字串的長度均不超過 10,求給定的字串從前往後最多有多少位可以與字典匹配。題解 設 dp i 表示串的前 i 位是否能夠與字典匹配,若 dp i 1 則對 s i 1,部分與字典進行匹配,即 對可以匹配的最大長度進行拓展。由於字典中每個串的...
洛谷 P2292 AC自動機 狀態壓縮
題目問,給定 n nn 個模式串,問你主串的 可理解的 最長字首長度。可理解的 意思指可以被分成若干個模式串。首先我們知道ac自動機,fai lfail fail 指標跳轉的是相同字尾,在跳轉的過程中會依據長度從大到小經過相同的字尾。比如 abc d bc d dabcd bcd d abcd bc...
AC自動機 洛谷P3808 AC自動機(簡單版)
給定 n n 個模式串和1個文字串,求有多少個模式串在文字串裡出現過 多模匹配用ac role presentation aca c自動機 首先建造一棵字典樹,新增所有模式串,然後建造失配指標,最後進行匹配 luogu judger enable o2 include include include...