Warning: session_start(): open(/tmp/sess_45b36e89dd04c6d5a87a6d6ccd03d5e6, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430
Writing /data/wiki/data/cache/6/6a0f3843c5ea426c08feea4e44f84973.captchaip failed

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:hotpot:ac自动机 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:hotpot:ac自动机

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
2020-2021:teams:hotpot:ac自动机 [2020/08/26 15:29]
lotk
2020-2021:teams:hotpot:ac自动机 [2020/08/26 15:44] (当前版本)
lotk
行 236: 行 236:
  Print();  Print();
  }  }
 + return 0;
 +}
 +
 +</​code>​
 +
 +[[https://​www.luogu.com.cn/​problem/​P5357|P5357 【模板】AC自动机(二次加强版)]]
 +
 +ps:​本题方法基本同上,记录一下每个串在trie上对应的点就可以了。
 +
 +<code cpp>
 +
 +#​include<​algorithm>​
 +#​include<​stack>​
 +#​include<​ctime>​
 +#​include<​cstring>​
 +#​include<​cmath>​
 +#​include<​iostream>​
 +#​include<​iomanip>​
 +#​include<​cstdio>​
 +#​include<​queue>​
 +using namespace std;
 +inline int read(){
 + int num=0,​f=1;​char x=getchar();​
 + while(x<'​0'​||x>'​9'​){if(x=='​-'​)f=-1;​x=getchar();​}
 + while(x>​='​0'&&​x<​='​9'​){num=num*10+x-'​0';​x=getchar();​}
 + return num*f;
 +}
 +const int maxn=200005;​
 +char s[maxn*10];
 +bool str[maxn];
 +int ch[maxn][26],​cnt,​fail[maxn];​
 +int nxt[maxn],​uni[maxn];​
 +int n; 
 +void Insert(int bh){
 + scanf("​%s",​s);​
 + int len=strlen(s);​
 + int x=0;
 + for(int i=0;​i<​len;​++i){
 + int t=s[i]-'​a';​
 + if(!ch[x][t])ch[x][t]=++cnt;​
 + x=ch[x][t];​
 + }
 + str[x]=true;​uni[bh]=x;​
 +}
 +queue<​int>​ Q;
 +void build_ac(){
 + Q.push(0);
 + while(Q.size()){
 + int x=Q.front();​Q.pop();​
 + for(int i=0;​i<​26;​++i)
 + if(ch[x][i]){
 + if(x){
 + fail[ch[x][i]]=ch[fail[x]][i];​
 + if(str[ch[fail[x]][i]])nxt[ch[x][i]]=ch[fail[x]][i];​
 + else nxt[ch[x][i]]=nxt[ch[fail[x]][i]];​
 + }
 + Q.push(ch[x][i]);​
 + }else ch[x][i]=ch[fail[x]][i];​
 + }
 +}
 +int num[maxn];
 +void qans(){
 + scanf("​%s",​s);​
 + int len=strlen(s);​
 + int x=0;
 + for(int i=0;​i<​len;​++i){
 + int t=s[i]-'​a';​
 + int nw=ch[x][t];​
 + while(nw){
 + if(str[nw])++num[nw];​
 + nw=nxt[nw];​
 + }
 + x=ch[x][t];​
 + }
 +}
 +int main(){
 + n=read();
 + for(int i=1;​i<​=n;​++i)Insert(i);​
 + build_ac();​
 + qans(); ​
 + for(int i=1;​i<​=n;​++i)printf("​%d\n",​num[uni[i]]);​
  return 0;  return 0;
 } }
  
 </​code>​ </​code>​
2020-2021/teams/hotpot/ac自动机.1598426967.txt.gz · 最后更改: 2020/08/26 15:29 由 lotk