2016 年青岛网络赛---Family View(AC自动机)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=5880
Problem ;Description
Steam ;is ;a ;digital ;distribution ;platform ;developed ;by ;Valve ;Corporation ;offering ;digital ;rights ;management ;(DRM), ;multiplayer ;gaming ;and ;social ;networking ;services. ;A ;family ;view ;can ;help ;you ;to ;prevent ;your ;children ;access ;to ;some ;content ;which ;are ;not ;suitable ;for ;them. Take ;an ;MMORPG ;game ;as ;an ;example, ;given ;a ;sentence ;T, ;and ;a ;list ;of ;forbidden ;words ;{P}, ;your ;job ;is ;to ;use ;'*' ;to ;subsititute ;all ;the ;characters, ;which ;is ;a ;part ;of ;the ;substring ;matched ;with ;at ;least ;one ;forbidden ;word ;in ;the ;list ;(case-insensitive).For ;example, ;T ;is: ;"I ;love ;Beijing's ;Tiananmen, ;the ;sun ;rises ;over ;Tiananmen. ;Our ;great ;leader ;Chairman ;Mao, ;he ;leades ;us ;marching ;on."And ;{P} ;is: ;{"tiananmen", ;"eat"}The ;result ;should ;be: ;"I ;love ;Beijing's ;*********, ;the ;sun ;rises ;over ;*********. ;Our ;gr*** ;leader ;Chairman ;Mao, ;he ;leades ;us ;marching ;on."
Input
The ;first ;line ;contains ;the ;number ;of ;test ;cases. ;For ;each ;test ;case:The ;first ;line ;contains ;an ;integer <span ;id="MathJax-Element-1-Frame" ;class="MathJax"><span ;id="MathJax-Span-1" ;class="math"><span ;id="MathJax-Span-2" ;class="mrow"><span ;id="MathJax-Span-3" ;class="mi">n</span></span>, ;represneting ;the ;size ;of ;the ;forbidden ;words ;list <span ;id="MathJax-Element-2-Frame" ;class="MathJax"><span ;id="MathJax-Span-4" ;class="math"><span ;id="MathJax-Span-5" ;class="mrow"><span ;id="MathJax-Span-6" ;class="mi">P</span></span>. ;Each ;line ;of ;the ;next <span ;id="MathJax-Element-3-Frame" ;class="MathJax"><span ;id="MathJax-Span-7" ;class="math"><span ;id="MathJax-Span-8" ;class="mrow"><span ;id="MathJax-Span-9" ;class="mi">n</span></span> lines ;contains ;a ;forbidden ;words <span ;id="MathJax-Element-4-Frame" ;class="MathJax"><span ;id="MathJax-Span-10" ;class="math"><span ;id="MathJax-Span-11" ;class="mrow"><span ;id="MathJax-Span-12" ;class="msubsup"><span ;id="MathJax-Span-13" ;class="mi">P<span ;id="MathJax-Span-14" ;class="mi">i<span ;id="MathJax-Span-15" ;class="mtext"> <span ;id="MathJax-Span-16" ;class="mo">(<span ;id="MathJax-Span-17" ;class="mn">1<span ;id="MathJax-Span-18" ;class="mo">≤<span ;id="MathJax-Span-19" ;class="texatom"><span ;id="MathJax-Span-20" ;class="mrow"><span ;id="MathJax-Span-21" ;class="mo">|<span ;id="MathJax-Span-22" ;class="msubsup"><span ;id="MathJax-Span-23" ;class="mi">P<span ;id="MathJax-Span-24" ;class="mi">i<span ;id="MathJax-Span-25" ;class="texatom"><span ;id="MathJax-Span-26" ;class="mrow"><span ;id="MathJax-Span-27" ;class="mo">|<span ;id="MathJax-Span-28" ;class="mo">≤<span ;id="MathJax-Span-29" ;class="mn">1000000<span ;id="MathJax-Span-30" ;class="mo">,<span ;id="MathJax-Span-31" ;class="mo">∑<span ;id="MathJax-Span-32" ;class="texatom"><span ;id="MathJax-Span-33" ;class="mrow"><span ;id="MathJax-Span-34" ;class="mo">|<span ;id="MathJax-Span-35" ;class="msubsup"><span ;id="MathJax-Span-36" ;class="mi">P<span ;id="MathJax-Span-37" ;class="mi">i<span ;id="MathJax-Span-38" ;class="texatom"><span ;id="MathJax-Span-39" ;class="mrow"><span ;id="MathJax-Span-40" ;class="mo">|<span ;id="MathJax-Span-41" ;class="mo">≤<span ;id="MathJax-Span-42" ;class="mn">1000000<span ;id="MathJax-Span-43" ;class="mo">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> where <span ;id="MathJax-Element-5-Frame" ;class="MathJax"><span ;id="MathJax-Span-44" ;class="math"><span ;id="MathJax-Span-45" ;class="mrow"><span ;id="MathJax-Span-46" ;class="msubsup"><span ;id="MathJax-Span-47" ;class="mi">P<span ;id="MathJax-Span-48" ;class="mi">i</span></span></span></span> only ;contains ;lowercase ;letters.The ;last ;line ;contains ;a ;string <span ;id="MathJax-Element-6-Frame" ;class="MathJax"><span ;id="MathJax-Span-49" ;class="math"><span ;id="MathJax-Span-50" ;class="mrow"><span ;id="MathJax-Span-51" ;class="mi">T<span ;id="MathJax-Span-52" ;class="mtext"> <span ;id="MathJax-Span-53" ;class="mo">(<span ;id="MathJax-Span-54" ;class="texatom"><span ;id="MathJax-Span-55" ;class="mrow"><span ;id="MathJax-Span-56" ;class="mo">|<span ;id="MathJax-Span-57" ;class="mi">T<span ;id="MathJax-Span-58" ;class="texatom"><span ;id="MathJax-Span-59" ;class="mrow"><span ;id="MathJax-Span-60" ;class="mo">|<span ;id="MathJax-Span-61" ;class="mo">≤<span ;id="MathJax-Span-62" ;class="mn">1000000<span ;id="MathJax-Span-63" ;class="mo">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span>.</span></span></span></span></span></span></span></span></span></span></span></span>
Output
For ;each ;case ;output ;the ;sentence ;in ;a ;line.
Sample ;Input
; ;<div>1 ; ;3 ; ;trump ; ;ri ; ;o ; ;Donald ;John ;Trump ;(born ;June ;14, ;1946) ;is ;an ;American ;businessman, ;television ;personality, ;author, ;politician, ;and ;the ;Republican ;Party ;nominee ;for ;President ;of ;the ;United ;States ;in ;the ;2016 ;election. ;He ;is ;chairman ;of ;The ;Trump ;Organization, ;which ;is ;the ;principal ;holding ;company ;for ;his ;real ;estate ;ventures ;and ;other ;business ;interests.
Sample ;Output
; ;<div>D*nald ;J*hn ;***** ;(b*rn ;June ;14, ;1946) ;is ;an ;Ame**can ;businessman, ;televisi*n ;pers*nality, ;auth*r, ;p*litician, ;and ;the ;Republican ;Party ;n*minee ;f*r ;President ;*f ;the ;United ;States ;in ;the ;2016 ;electi*n. ;He ;is ;chairman ;*f ;The ;***** ;*rganizati*n, ;which ;is ;the ;p**ncipal ;h*lding ;c*mpany ;f*r ;his ;real ;estate ;ventures ;and ;*ther ;business ;interests.
Source
2016 ;ACM/ICPC ;Asia ;Regional ;Qingdao ;Online
Recommend
wange2014 | We ;have ;carefully ;selected ;several ;similar ;problems ;for ;you: 5901 5899 5898 5897 5896
题意:有n个由小写字母构成的敏感词,现在给了一个主串,要求将其中出现的敏感词由” ;* ; ;代替 ;然后输出这个主串;
思路:套用AC自动机模板,较快的处理方法是定义一个标记数组v[maxn] ;,在主串中出现敏感词的开始位置v[start]++,结束位置v[end+1]-- ; ;最后在对主串输出时,sum+=v[i], ;如果sum>0 ;输出”* ;否则输出字符。 ; ;这题数据较大,很多人都一直爆内存,我也是~ ; 我在建立trie树的时候用的链表,那么每次插入新的节点时都开了一个节点的空间,每组数据算完后没有清理这些空间,所以不管怎么改一直爆内存,后来才发现,唉! ; 所以一定要注意清空内存哦!
代码如下:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define N 1000005 using namespace std; char str[1000005]; int v[1000005]; int head,tail; struct node { node *fail; node *next[26]; int count; node() { fail=NULL; count=0; for(short i=0;i<26;i++) next[i]=NULL; } }*q[N]; node *root; void insert(char *str) ///建立Trie { int temp,len; node *p=root; len=strlen(str); for(int i=0;i<len;i++) { temp=str[i]-'a'; if(p->next[temp]==NULL) p->next[temp]=new node(); p=p->next[temp]; } p->count=len; } void setfail() ///初始化fail指针,BFS { q[tail++]=root; while(head!=tail) { node *p=q[head++]; node *temp=NULL; for(short i=0;i<26;i++) if(p->next[i]!=NULL) { if(p==root) ///首字母的fail必指向根 p->next[i]->fail=root; else { temp=p->fail; ///失败指针 while(temp!=NULL) ///2种情况结束:匹配为空or找到匹配 { if(temp->next[i]!=NULL) ///找到匹配 { p->next[i]->fail=temp->next[i]; break; } temp=temp->fail; } if(temp==NULL) ///为空则从头匹配 p->next[i]->fail=root; } q[tail++]=p->next[i]; ///入队; } } } void query() { node *p=root; int len=strlen(str); for(int i=0;i<len;i++) { int index; if(str[i]>='A'&&str[i]<='Z') index=str[i]-'A'; else if(str[i]>='a'&&str[i]<='z') index=str[i]-'a'; else { p=root; continue; } while(p->next[index]==NULL&&p!=root) ///跳转失败指针 p=p->fail; p=p->next[index]; if(p==NULL) p=root; node *temp=p; ///p不动,temp计算后缀串 while(temp!=root) { if(temp->count>0) { v[i-temp->count+1]++; v[i+1]--; break; } temp=temp->fail; } } return ; } int main() { int T, num; scanf("%d",&T); while(T--) { for(int i=0;i<tail;i++) free(q[i]); memset(v,0,sizeof(v)); head=tail=0; root = new node(); scanf("%d", &num); getchar(); for(int i=0;i<num;i++) { gets(str); insert(str); } setfail(); gets(str); int len=strlen(str),sum=0; query(); for(int i=0;i<len;i++) { sum+=v[i]; if(sum<=0) printf("%c",str[i]); else printf("*"); } puts(""); } return 0; }; ; ; ;