hdu2222_ac自动机模版题

来源:互联网 发布:苹果手机价格评估软件 编辑:程序博客网 时间:2024/05/01 08:12

靠靠靠太煞笔了。。。

本来昨天晚上想得吃完饭回去就能写完,结果硬是调了一晚上加一早晨原因是有个地方应该每次访问都加一我写成了每次都赋值为1。。。。

喜闻乐见的模版题就不多说了。。。

靠竟然为了这个题没有看丹佛野马的nfl美联决赛。。。。

一会七点半的国联决赛也看不成了。。。

#include<iostream>#include<queue>#define MAX 1000005#include<cstring>#include<string>#include<cstdio>#include<algorithm> using namespace std; int n; struct trie{int ch[MAX][28];int val[MAX];int sz;int fail[MAX];trie(){sz=0;memset(ch[0],0,sizeof(ch[0]));memset(val,false,sizeof(val));}int num(char cj){return(cj-'a'+1);}void insert(string s){int len=s.length();int u=0;for(int i=0;i<len;i++){int c=num(s[i]);if(!ch[u][c]){memset(ch[sz],0,sizeof(ch[sz]));ch[u][c]=++sz;u=sz;}elseu=ch[u][c];}val[u]++;}void clear(){sz=0;memset(ch,0,sizeof(ch));memset(val,0,sizeof(val));memset(fail,0,sizeof(fail));}}wbysr; void init(){string s1;scanf("%d",&n);for(int i=1;i<=n;i++){cin>>s1;wbysr.insert(s1);}return;}void make_fail(){wbysr.fail[0]=-1;int x,y,t;queue<int>q;q.push(0);while(!q.empty()){x=q.front();q.pop();for(int i=1;i<=26;i++)if(wbysr.ch[x][i]){y=wbysr.ch[x][i];q.push(y);t=wbysr.fail[x];while(t!=-1&&!wbysr.ch[t][i])t=wbysr.fail[t];if(t>=0)wbysr.fail[y]=wbysr.ch[t][i];elsewbysr.fail[y]=0;}}} void fuck_it(){string word;cin>>word;int len=word.length(),now=0,ans=0;int j;for(int i=0;i<len;i++){j=word[i]-'a'+1;while(now!=-1&&!wbysr.ch[now][j])now=wbysr.fail[now];if(now>=0)now=wbysr.ch[now][j];elsenow=0;for(int j=now;j!=-1;j=wbysr.fail[j]){ans+=wbysr.val[j];wbysr.val[j]=0;}}printf("%d\n",ans);} int main(){int time;scanf("%d",&time);while(time--){wbysr.clear();init();make_fail();fuck_it();}return 0;}

0 0