洛谷 P3808 模板 AC自動機(簡單版)

2022-08-10 17:06:15 字數 1060 閱讀 1895

傳送門:

題解:是乙個ac自動機的裸題了,注釋加在**裡面了

#includeusing namespace std;

const int maxn = 1e6 + 5, sigma_size = 26;

int ch[maxn][sigma_size];

int tot; //結點總數

int ans = 0;

int f[maxn]; //失配函式

int last[maxn];//表示 i沿著失配指標往回走時,遇到的下乙個單詞結點(即是該單詞的最後乙個結點)的編號

int val[maxn]; //若值不為0表示該結點是單詞的最後乙個結點

char a[maxn];

char b[maxn];

void init()

void insert(char *str)//將所有模式串構建成乙個字典樹

p = ch[p][c];

}val[p] ++;//標記此結點為末尾 同時代表模式串中 相同的字串有幾個

}void find(char *str)

else if(val[last[u]])//判斷是否為單詞的末尾結點

}}void getfail()//通過bfs進行計算fail函式

}while(!q.empty())

(則可以把while語句刪除),路徑壓縮

q.push(u);

int v = f[r];

while(v && !ch[v][c])//沿著失配邊走 直到可以匹配 和kmp類似

v = f[v];

f[u] = ch[v][c];

last[u] = val[f[u]] ? f[u] : last[f[u]];//last需要指向單詞末尾 用val陣列判斷}}

}int main(void)

getfail();

scanf("%s", b);

find(b);

cout << ans << endl;

return 0;

}

AC自動機入門,洛谷P3808

給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。輸入輸出格式 輸入格式 第一行乙個n,表示模式串個數 下面n行每行乙個模式串 下面一行乙個文字串。輸出格式 乙個數表示答案 輸入輸出樣例 輸入樣例 1 2aaa aa輸出樣例 1 兩個會出現在模板題面裡的詞語 文字串和模式串 給你幾個單詞...

洛谷P3808 模板 AC自動機(簡單版)

這是一道簡單的ac自動機模板題。用於檢測正確性以及演算法常數。為了防止卡oj,在保證正確的基礎上只有兩組資料,請不要惡意提交。給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。輸入格式 第一行乙個n,表示模式串個數 下面n行每行乙個模式串 下面一行乙個文字串。輸出格式 乙個數表示答案 輸...

洛谷P3808 模板 AC自動機(簡單版)

給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。輸入格式 第一行乙個n,表示模式串個數 下面n行每行乙個模式串 下面一行乙個文字串。輸出格式 乙個數表示答案 include using namespace std int const n 1000005 int const m 1000...