zoukankan      html  css  js  c++  java
  • CENSORING

    CENSORING

    题目描述

    FJ为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西(比如如何煮牛排)。

    FJ将杂志中所有的文章提取出来组成一个长度最多为10^5的字符串S。他有一个要从S中删除的词语的列表,t1,t2...tn。

    FJ每次找到最早的出现在列表里的子串,然后将其删去。他重复此过程,直到找不到这样的子串。值得注意的是删除一个单词可能产生一个新的之前并没有出现过的要被删除的单词。

    FJ保证列表中没有一个字符串是另一个字符串的子串。要就是说每次要删的单词是唯一确定的。

    帮助FJ确定最终S的删减版。

    Solution
    考虑把T建成AC自动机。把S扔进去匹配,,用栈记录每一步的位置,遇到可匹配点就往后跳到匹配该串前的位置。
     
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<cmath>
     7 #include<queue>
     8 #define maxn 300050 
     9 using namespace std;
    10 int n,len,tot,top;
    11 int tr[maxn][28],fail[maxn],p[maxn];
    12 char s[maxn],ch[maxn];
    13 int zh[maxn];char ans[maxn];
    14 void ins(){
    15     int len=strlen(ch),k=0;
    16     for(int i=0;i<len;i++){
    17         if(!tr[k][ch[i]-'a'])tr[k][ch[i]-'a']=++tot;
    18         k=tr[k][ch[i]-'a'];
    19     }
    20     p[k]=len;
    21 }
    22 void build(){
    23     queue<int>q;
    24     for(int i=0;i<26;i++)if(tr[0][i])q.push(tr[0][i]);
    25     while(!q.empty()){
    26         int k=q.front();q.pop();
    27         for(int i=0;i<26;i++){
    28             if(tr[k][i]){
    29                 fail[tr[k][i]]=tr[fail[k]][i];
    30                 q.push(tr[k][i]);
    31             }
    32             else tr[k][i]=tr[fail[k]][i];
    33         }
    34     }
    35 }
    36 int main()
    37 {
    38     scanf("%s",s);
    39     cin>>n;
    40     for(int i=1;i<=n;i++){
    41         scanf("%s",ch);
    42         ins();
    43     }
    44     build();
    45     n=strlen(s);int k=0;
    46     for(int i=0;i<n;i++){
    47         k=tr[k][s[i]-'a'];
    48         zh[++top]=k;ans[top]=s[i];
    49         if(p[k]){
    50             top-=p[k];k=zh[top];
    51         }
    52     }
    53     for(int i=1;i<=top;i++)printf("%c",ans[i]);
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    centos 7 安装tomcat
    centos 7 安装jdk1.8
    centos 7 安装MySql
    java项目异常监控_JAVA项目中的常用的异常处理情况总结
    Cron表达式
    JAVA编写的预警系统
    Spring 的 Controller 是单例还是多例?怎么保证并发的安全!
    字符串0.00000--》0E-8
    按月份统计数据
    SQL 添字段,修改辽段属性,或备注
  • 原文地址:https://www.cnblogs.com/liankewei/p/10666899.html
Copyright © 2011-2022 走看看