意甲冠军:

到原始字符串。给n字符串,每个字符串都有一个属性,属性0代表重叠,1代表不能重叠

请各多少次出现的字符串

思维:

为了便于建立两台机器自己主动(0一个。1一个)

然后,它可以重叠非常好做,谁做

不可重叠的话须要记录两个东西

len[i]代表每一个串的长度,used[i]代表每一个串在之前出现的位置,初始化-1

然后遍历到的时候对于当前位置 j。 必须j>=used[i]+len[i] 才干算出现。而且更新

须要注意的是:

会出现相同属性而且相同的串。

我处理的方式就是排序。按id排序大的在前

然后算一遍大的,用大的赋值给id 小的且串同样的。

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
char fuck[123456];
int ans[123456],used[123456],len[123456];
struct word
{
int x,id;
char y[7];
} dc[123456];
struct trie
{
int mark;
trie *next[27];
trie *fail;
trie()
{
mark=0;
memset(next,0,sizeof(next));
fail=NULL;
}
};
trie *root0,*root1;
void init(int key,char *v,int id)
{
trie *p;
if(key) p=root1;
else p=root0;
for(int i=0; v[i]; i++)
{
int tep=v[i]-'a';
if(p->next[tep]==NULL) p->next[tep]=new trie();
p=p->next[tep];
}
p->mark=id;
}
void del(trie *p)
{
for(int j=0; j<26; j++) if(p->next[j]!=NULL) del(p->next[j]);
free(p);
}
void getac()
{
queue<trie*>q;
q.push(root0);
while(!q.empty())
{
trie *p,*tep;
p=q.front();
q.pop();
for(int i=0; i<26; i++)
{
if(p->next[i]!=NULL)
{
if(p==root0) p->next[i]->fail=root0;
else
{
tep=p->fail;
while(tep!=NULL)
{
if(tep->next[i]!=NULL)
{
p->next[i]->fail=tep->next[i];
break;
}
tep=tep->fail;
}
if(tep==NULL) p->next[i]->fail=root0;
}
q.push(p->next[i]);
}
}
}
q.push(root1);
while(!q.empty())
{
trie *p,*tep;
p=q.front();
q.pop();
for(int i=0; i<26; i++)
{
if(p->next[i]!=NULL)
{
if(p==root1) p->next[i]->fail=root1;
else
{
tep=p->fail;
while(tep!=NULL)
{
if(tep->next[i]!=NULL)
{
p->next[i]->fail=tep->next[i];
break;
}
tep=tep->fail;
}
if(tep==NULL) p->next[i]->fail=root1;
}
q.push(p->next[i]);
}
}
}
}
void finde(char *v)
{
trie *p0=root0,*p1=root1;
for(int i=0; v[i]; i++)
{
int tep=v[i]-'a';
while(p0->next[tep]==NULL && p0!=root0)
p0=p0->fail;
p0=p0->next[tep];
if(p0==NULL) p0=root0;
trie *q0=p0;
while(q0!=root0)
{
if(q0->mark!=0) ans[q0->mark]++;
q0=q0->fail;
}
while(p1->next[tep]==NULL && p1!=root1)
p1=p1->fail;
p1=p1->next[tep];
if(p1==NULL) p1=root1;
trie *q1=p1;
while(q1!=root1)
{
if(q1->mark!=0)
{
if(i>=used[q1->mark]+len[q1->mark]) //不可重叠的推断
{
ans[q1->mark]++;
used[q1->mark]=i;
}
}
q1=q1->fail;
}
}
}
int cmp(word a,word b) //排序的cmp
{
if(a.x==b.x)
{
if(strcmp(a.y,b.y)==0)
{
if(a.id>b.id) return 1;
else return 0;
}
else
{
if(strcmp(a.y,b.y)>0) return 1;
else return 0;
}
}
else
{
if(a.x>b.x) return 1;
else return 0;
}
}
int main()
{
int cas=1;
while(scanf("%s",fuck)!=-1)
{
int n;
scanf("%d",&n);
root0=new trie();
root1=new trie();
for(int i=1; i<=n; i++)
{
int x;
char y[12];
scanf("%d%s",&x,y);
len[i]=strlen(y);
init(x,y,i);
dc[i].x=x;
strcpy(dc[i].y,y);
dc[i].id=i;
}
memset(ans,0,sizeof(ans));
memset(used,-1,sizeof(used));
getac();
finde(fuck);
sort(dc+1,dc+1+n,cmp);
int i;
for(i=1; dc[i+1].x==1; i++) //赋值给那些反复的
{
if(strcmp(dc[i].y,dc[i+1].y)==0)
ans[dc[i+1].id]=ans[dc[i].id];
}
for(i=i+1; i<n; i++)
{
if(strcmp(dc[i].y,dc[i+1].y)==0)
ans[dc[i+1].id]=ans[dc[i].id];
}
printf("Case %d\n",cas++);
for(int i=1; i<=n; i++) printf("%d\n",ans[i]);
del(root0);
del(root1);
puts("");
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

[AC自己主动机] zoj Searching the String的更多相关文章

  1. ZOJ 3228 Searching the String (AC自己主动机)

    题目链接:Searching the String 解析:给一个长串.给n个不同种类的短串.问分别在能重叠下或者不能重叠下短串在长串中出现的次数. 能重叠的已经是最简单的AC自己主动机模板题了. 不能 ...

  2. ZOJ - 3228 Searching the String (AC自己主动机)

    Description Little jay really hates to deal with string. But moondy likes it very much, and she's so ...

  3. zoj 3430 Detect the Virus(AC自己主动机)

    Detect the Virus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day, Nobita found that his co ...

  4. ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)

    题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到b ...

  5. AC自己主动机

    AC自己主动机 AC自己主动机是KMP和Trie的结合,主要处理多模板串匹配问题.以下推荐一个博客,有助于学习AC自己主动机. NOTONLYSUCCESS  这里另一个Kuangbin开的比赛,大家 ...

  6. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

  7. 【UVA】1449-Dominating Patterns(AC自己主动机)

    AC自己主动机的模板题.须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果. 14360841 1449 option=com_onlinejudge& ...

  8. POJ 3691 &amp; HDU 2457 DNA repair (AC自己主动机,DP)

    http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...

  9. HDU 2896 病毒侵袭 AC自己主动机题解

    本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...

随机推荐

  1. Oracle 字符集的查看和修改 分类: H2_ORACLE 2013-06-19 16:52 316人阅读 评论(0) 收藏

    一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...

  2. css3-6 表格如何设置样式和定位样式是什么

    css3-6 表格如何设置样式和定位样式是什么 一.总结 一句话总结:css可以解决所有属性设置的样式. 1.表格如何设置样式? css样式可以解决一切问题,没必要在表格上面加属性来设置样式. 7 t ...

  3. Java 开源博客——B3log Solo 0.6.6 正式版发布了!

    Java 开源博客 -- B3log Solo 0.6.6 正式版发布了!欢迎大家下载. 该版本引入了数据库连接池:Druid. 另外,欢迎观摩 B3log 团队的新项目:Noty,也非常欢迎大家参与 ...

  4. Android中的动画详解系列【3】——自定义动画研究

    在上一篇中我们使用到了位移动画TranslateAnimation,下面我们先来看看TranslateAnimation是如何实现Animation中的抽象方法的: /* * Copyright (C ...

  5. Mac OSX 下配置 LNMP开发环境

    不久前负责了一个项目需要配置PHP7的开发环境,因为之前所有的项目用的是PHP5的,所以研究了这些东西,但是很遗憾,电脑出了问题,不得已重装了系统,然后你懂得...什么都没有了,要重新来过.. 虽然本 ...

  6. Android的NDK开发(1)————Android JNI简介与调用流程

    1.JNI简介 JNI全称为Java Native Interface(Java本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...

  7. Birt

    http://www.eclipse.org/birt/ 咖啡图 http://www.kafeitu.me/activiti/2012/05/26/kft-activiti-demo.html

  8. [CortexM0--stm32f0308]Option Byte

    问题描写叙述 option byte,算是IC中比較简单的功能,就是用户能够写入数据,对IC的某些功能进行配置.而IC在reset时,会载入当中的内容,进行推断,从而使用户的配置生效. option ...

  9. 安装 Visual Studio,连接中国区 Azure

    中国数据中心 目前,中国区 Azure 有两个数据中心,在位置字段中显示为“中国北部”和“中国东部”. 在 Azure 上创建应用程序的区别 在中国区 Azure 上开发应用程序与在境外 Azure ...

  10. Redis管理及监控工具

    Redis管理及监控工具 Redis做为现在web应用开发的黄金搭担组合,大量的被应用,广泛用于存储session信息,权限信息,交易作业等热数据.做为一名有10年以上JAVA开发经验的程序员,工作中 ...