这个题由于满足递归的性质,所以可以用 ac自动机 + 栈 处理

然并卵,莫名T了一个点、

#include<iostream>
#include<cstdio>
using namespace std;
#include<cstring>

struct ac {
    ac *fail; 
    ac * xia[26];
    int ci,ceng;

ac() { 
        fail = NULL;
        ci= 0;
        memset(xia, NULL, sizeof (xia));
    }
} *q[10000001],*root;
int hehe,changdu[500001],i,huhu; 
char s1[500001];
int zhen1,zhen2;

void insert(char *str, ac *root) {
    ac *p = root;
    int i = 0, zimu;
    while (str[i]) {
        zimu = str[i] - 'a';
        if (p->xia[zimu] == NULL)
        {
            p->xia[zimu] = new ac();
        }
        p = p->xia[zimu];
        i++;
    }
    p->ci=++hehe;
}

void shipei(ac *root) {
    int i;
    root->fail = NULL;
    q[zhen1++] = root;
    while (zhen1 != zhen2) {
        ac *now = q[zhen2++];
        ac *p = NULL;
        for (i = 0; i < 26; i++) {
            if (now->xia[i] != NULL) {
                if (now == root)
                    now->xia[i]->fail = root;
                else {
                    p = now->fail;
                    while (p != NULL) {
                        if (p->xia[i] != NULL) {
                            now->xia[i]->fail = p->xia[i];
                            break;
                        }
                        p = p->fail;
                    }
                    if (p == NULL)
                        now->xia[i]->fail = root;
                }
                q[zhen1++] = now->xia[i];
            }
        }
        
    }
}

int zhan[500005],zhen;
char ystr[500005];
int zimu;
ac *tui(ac *now)
{
      zimu = ystr[i] - 'a';
     
    while (now->xia[zimu] == NULL && now != root) now = now->fail;
        now = now->xia[zimu];
        if(now==NULL)now=root;
        return now;
}

ac *f[500008];
void work()
{    //cout<<"ppp";
   // ac *shang=root;
    zhan[0]=500005;
    int *zhen=zhan;
    
    f[500005]=root;int fin=strlen(ystr);
    
    for(i=0;i<fin;i++)
    {
       ++zhen;
  *zhen=i;
       
       f[i]=tui(f[*(zhen-1)]);
        if(f[i]->ci)zhen-=changdu[f[i]->ci];
    }
 
    
    for(int *i=zhan+1;i!=zhen;i++)
    {
    printf("%c",ystr[*i]);
}
    printf("%c",ystr[*zhen]);
}

int main() {
    int n, t;
    scanf("%s", ystr);
        zhen1 = zhen2 = 0;
      root = new ac();
        scanf("%d", &n);
     
        
        for(i=1;i<=n;i++){
            scanf("%s",s1);
            insert(s1, root);
            changdu[i]=strlen(s1);
        }
     //   cout<<strlen(ystr)<<" ";
        shipei(root);
        
        //cout<<"pp";
      work();
       
    return 0;
}

当天下午,终于过了,,,

托做多了lych的题的福,总算应用记搜了、(记搜还真是强大,虽然比正解慢

#include<iostream>
#include<cstdio>
using namespace std;
#include<cstring>struct ac {ac *fail; ac * xia[26];int ci,ceng; ac() { fail = NULL;ci= 0;memset(xia, NULL, sizeof (xia));}
} *q[500001],*root;
int hehe,changdu[100001],i,huhu;
char s1[100001];
int zhen1,zhen2; void insert(char *str, ac *root) {ac *p = root;int i = 0, zimu;while (str[i]) {zimu = str[i] - 'a';if (p->xia[zimu] == NULL){p->xia[zimu] = new ac();}p = p->xia[zimu];i++;}p->ci=++hehe;
}void shipei(ac *root) {int i;root->fail = NULL;q[zhen1++] = root;while (zhen1 != zhen2) {ac *now = q[zhen2++];ac *p = NULL;for (i = 0; i < 26; i++) {if (now->xia[i] != NULL) {if (now == root)now->xia[i]->fail = root;else {p = now->fail;while (p != NULL) {if (p->xia[i] != NULL) {now->xia[i]->fail = p->xia[i];break;}p = p->fail;}if (p == NULL)now->xia[i]->fail = root;}q[zhen1++] = now->xia[i];}}}
}
ac *jisou[200001][27];
int zhan[100009],zhen;
char ystr[100005];
int zimu;
ac *tui(ac *now)
{      int jishu=0;
zimu = ystr[i] - 'a';if(zhan[zhen-1]>=0&&jisou[zhan[zhen-1]][zimu]!=NULL)return jisou[zhan[zhen-1]][zimu];while (now->xia[zimu] == NULL && now != root) now = now->fail,++jishu;now = now->xia[zimu];if(now==NULL)now=root;if(zhan[zhen-1]>=0) jisou[zhan[zhen-1]][zimu]=now;//if(jishu>2)cout<<i<<" "<<"gg";return now;
}ac *f[100008];
void work()
{    //cout<<"ppp";// ac *shang=root;zhan[0]=100005;f[100005]=root;int fin=strlen(ystr);for(i=0;i<fin;i++){zhan[++zhen]=i;f[i]=tui(f[zhan[zhen-1]]);if(f[i]->ci){zhen-=changdu[f[i]->ci];}}for(i=1;i<=zhen;i++){printf("%c",ystr[zhan[i]]);}}int main() {
//  freopen("censor.in","r",stdin);
//  freopen("censor.out","w",stdout);int n, t;scanf("%s", ystr);zhen1 = zhen2 = 0;root = new ac();scanf("%d", &n);for(i=1;i<=n;i++){scanf("%s",s1);insert(s1, root);changdu[i]=strlen(s1);}//   cout<<strlen(ystr)<<" ";shipei(root);//cout<<"pp";work();return 0;
}

2017.3.15 审查(黄金) 思考记录相关推荐

  1. 2017.9.15 最大数maxnumber 思考记录

    数论太难了,就水水结构 都是splay的基本操作,维护最大值和size即可 插入时直接找右子树 查找时往左边找 数据结构不对拍就不要交(奇奇怪怪的错误) 注意:区间合并时要考虑自己这个节点 码: #i ...

  2. 2017.6.15 数字表格 思考记录

    利用gcd相同数相乘,可以比较基础的化到 然后就是设T=ij,利用除法了 但这个西格玛在指数上,怎么办呢? 其实是不影响的,只要保证约数.倍数关系对好就行了 易错点: 1.大量取模逆元快速幂 2.m/ ...

  3. 2017.5.15 项链工厂 思考记录

    有是神烦码力费时题. 对于不同的操作只需要抓住一个原则: 顺时针是+   逆时针是-   F是顺逆互换 所以就可以打 区间赋值线段树了(和颜色种数没关系) 犯得错误:1.  开数组  << ...

  4. 2017.3.24 分裂游戏 思考记录

    事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了..    感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...

  5. 2017.10.29 染色方案 思考记录

    这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...

  6. 2017.10.24 上升序列 思考记录

    终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...

  7. 2017.10.7 括号序列 思考记录

    这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...

  8. 2017.9.28 约数研究 思考记录

    这个题一开始可能会想复杂, 然而它需要对答案的贡献进行归类 可以发现,一个约数对其倍数的数贡献是一样的,,所以可以考虑离散 所以直接对于每个数不好求,就可以考虑每个约数的贡献 而每个约数i就有n/i个 ...

  9. 2017.9.24 虔诚的墓主人 思考记录

    这个题是纯信息处理题. 首先要明白,对墓地进行枚举是会T的,需要对常青树进行枚举 所以枚举的顺序也要注意:一定要按某种顺序 然后要明白,每一个常青树会对列和行都造成影响,对答案有贡献的点只会在两个点之 ...

最新文章

  1. lvm讲解 磁盘故障小案例
  2. python语言翻译-教你用Python抓取百度翻译
  3. mysql udf提权_mysql——udf提权
  4. 虚拟机安装CentOS,网络配置
  5. 如何对SAP Leonardo上的机器学习模型进行重新训练
  6. shell 获取MD5值
  7. redis 命令行 操作
  8. 分布式发布订阅模型网络的实现有哪些
  9. Photoshop 入门教程,处理图层「4」如何向多图层图像中添加更多图像?
  10. 14.卷2(进程间通信)---System V 共享内存区
  11. 搜索神器Everything的功能技巧(非NTFS文件搜索,FTP/HTTP服务)
  12. html毕业设计任务要求,毕业设计任务及进度安排|毕业设计进度安排
  13. 2013应届毕业生“艺龙旅行网”校招应聘总结
  14. winform之修改图标
  15. linux离线日志分析工具,loganalyzer——日志分析工具
  16. matlab向量的简单随机抽样,matlab随机抽样
  17. 怎样压缩Word文档,Word压缩技巧分享
  18. char* char[] char** char*[] char[][]详解
  19. IE常见问题解决方案大全
  20. 单片机片内存储器烧写

热门文章

  1. C++ 各类树的算法
  2. Python绘制sigmoid函数及其导数图像
  3. mongodb的条件查询笔记
  4. mysql返回值_mysql_query的返回值
  5. mysql分组查询后插入新表,MySQL获取分组后的TOP 1和TOP N记录
  6. python加密字符串小写字母循环后错两位_python数据类型_字符串常用操作(详解)
  7. LoRa、LoRaWAN及网关相关技术介绍
  8. python快递分拣小程序_利用Python开发的ATM小程序
  9. 在centos7上使用Docker安装oracle 11g
  10. python的动态参数