题目链接:http://acm.nyist.net/JudgeOnline/PRoblem.php?pid=1085
中文题目,题意很明确,重点是重复单词的处理。用map统计,然后在暴力寻找,给未加入字典树统计的计数.
Code:
/*AC自动机*//*NYOJ 1085*/#include<stdio.h>#include<algorithm>#include<string.h>#include<iostream>#include<stdlib.h>#include<math.h>#include<queue>#include<map>#include<stack>using namespace std;#define mann 500010#define INF 0x3f3f3f3f#define Max 1e14+10typedef long long LL;struct Trie{ int next[mann][26],fail[mann],end[mann]; int root,L; int newnode() { for(int i=0; i<26; i++) next[L][i]=-1; end[L++]=-1; return L-1; } void init()//初始化 { L=0; root=newnode(); } void insert(char buf[],int id)//构造字典树 { int len=strlen(buf); int now=root; for(int i=0; i<len; i++) { if(next[now][buf[i]-'a']==-1) next[now][buf[i]-'a']=newnode(); now=next[now][buf[i]-'a']; } end[now]=id;//节点编号 } void build()//构造失败指针, { queue<int>Q; fail[root]=root; for(int i=0; i<26; i++) if(next[root][i]==-1) next[root][i]=root; else { fail[next[root][i]]=root; Q.push(next[root][i]); } while(!Q.empty()) { int now=Q.front(); Q.pop(); for(int i=0; i<26; i++) if(next[now][i]==-1) next[now][i]=next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } int num[mann]; void query(char buf[]) { memset(num,0,sizeof(num)); int len=strlen(buf); int now=root; int res=0; for(int i=0; i<len; i++) { now=next[now][buf[i]-'a']; int temp=now; while(temp!=root) { if(end[temp]!=-1) num[end[temp]]++;//num数组记录编号为end[temp]的单词出现的次数 //res+=end[temp]; //end[temp]=0; temp=fail[temp]; } } //return res; }};char buf[mann*2];char ss[1005][105];Trie ac;map<string,int>mp;int main(){ int t,n,m; scanf("%d",&t); while(t--) { mp.clear(); scanf("%d",&n); ac.init(); for(int i=0; i<n; i++) { scanf("%s",ss[i]); if(!mp[ss[i]])//注意重复单词的处理 ac.insert(ss[i],i); mp[ss[i]]++; } //printf("----------/n"); ac.build(); scanf("%s",buf); ac.query(buf); int maxx=0; for(int i=0; i<n; i++) { //cout<<ac.num[i]<<"* "; if(maxx<ac.num[i]) maxx=ac.num[i]; } printf("%d/n",maxx); for(int i=0; i<n; i++) { for(int j=i+1;j<n;j++) { if(strcmp(ss[i],ss[j])==0) ac.num[j]=ac.num[i]; } // cout<<ac.num[i]<<"* "; if(ac.num[i]==maxx) printf("%s/n",ss[i]); } } return 0;}/*24goodoooneoogoodafternooneveryone1towelcometotopcoder*/
新闻热点
疑难解答