ac_automation 模板

来源:互联网 发布:淘宝怎么更改退款金额 编辑:程序博客网 时间:2024/05/29 07:50

ac_automation 模板



I do remember your birthday

birthday

remember

timeless


PS:2017.6.10更改模板

#include<cmath>#include<ctime>#include<cstdio>#include<cstdlib>#include<cstring>#include<complex>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<queue>#include<set>#include<map>using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}    return x*f;}const int N=1000100;int n,top=0,sz=1,tr[N][26],fail[N],q[N],f[N],danger[N];char s[N],aim[N],a[N];bool mark[N];void insert()  {      int len=strlen(a);int now=1,k;      for(int i=0;i<len;i++)    {k=a[i]-'a';if(!tr[now][k])tr[now][k]=++sz;now=tr[now][k];}      danger[now]++;  } void ac_automation()  {     int head=0,tail=1,k,now;q[0]=1;    while(head<tail)      {          now=q[head++];          for(int i=0;i<26;i++)        {        if(tr[now][i])          {              k=fail[now];//while(!tr[k][i])k=fail[k];              fail[tr[now][i]]=tr[k][i];              q[tail++]=tr[now][i];          }        else         {tr[now][i]=tr[fail[now]][i];}        }    }  }void solve(){n=strlen(aim);int k,now=1,ans=0;f[0]=1;for(int i=0;i<n;i++){mark[now]=1;k=aim[i]-'a';          now=tr[now][k];           if(!mark[now])for(int j=now;j;j=fail[j])          {ans+=danger[j];danger[j]=0;}}printf("%d\n",ans);}int main(){scanf("%s",aim);for(int i=0;i<26;i++)tr[0][i]=1;fail[1]=0;n=read();while(n--)scanf("%s",a),insert();ac_automation();solve();return 0;}/*idorememberyourbirthday 3 birthday remember timeless 2*/


#include<cmath>#include<ctime>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<queue>#include<set>#include<map>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;}const int N=1000100;int n,m,tr[N][26],fail[N],q[N],danger[N],sz=1,ans;bool mark[N];char s[N],cm[N];void insert(){int len=strlen(s+1);int now=1,k;for(int i=1;i<=len;i++){k=s[i]-'a';if(!tr[now][k])tr[now][k]=++sz;now=tr[now][k];}danger[now]++;}      void ac_automation(){int head=0,tail=1,k,now;q[0]=1;fail[1]=0;while(head<tail){now=q[head++];for(int i=0;i<26;i++)if(tr[now][i]){k=fail[now];while(!tr[k][i])k=fail[k];fail[tr[now][i]]=tr[k][i];q[tail++]=tr[now][i];}}}void solve(){int k,t=1,n=strlen(cm+1);for(int i=1;i<=n;i++){mark[t]=1;k=cm[i]-'a';while(!tr[t][k])t=fail[t];t=tr[t][k]; if(!mark[t])for(int j=t;j;j=fail[j]){ans+=danger[j];danger[j]=0;}}printf("%d\n",ans);}int main(){scanf("%s",cm+1);n=read();for(int i=0;i<26;i++)tr[0][i]=1;while(n--){scanf("%s",s+1);insert();}ac_automation();solve();return 0;} /*idorememberyourbirthday3birthdayremembertimeless*/



0 0