傳送門:
題解:是乙個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...