[AC自己主动机] zoj Searching the String
意甲冠军:
到原始字符串。给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的更多相关文章
- ZOJ 3228 Searching the String (AC自己主动机)
题目链接:Searching the String 解析:给一个长串.给n个不同种类的短串.问分别在能重叠下或者不能重叠下短串在长串中出现的次数. 能重叠的已经是最简单的AC自己主动机模板题了. 不能 ...
- 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 ...
- zoj 3430 Detect the Virus(AC自己主动机)
Detect the Virus Time Limit: 2 Seconds Memory Limit: 65536 KB One day, Nobita found that his co ...
- ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)
题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到b ...
- AC自己主动机
AC自己主动机 AC自己主动机是KMP和Trie的结合,主要处理多模板串匹配问题.以下推荐一个博客,有助于学习AC自己主动机. NOTONLYSUCCESS 这里另一个Kuangbin开的比赛,大家 ...
- POJ 2778 DNA Sequence (AC自己主动机 + dp)
DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...
- 【UVA】1449-Dominating Patterns(AC自己主动机)
AC自己主动机的模板题.须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果. 14360841 1449 option=com_onlinejudge& ...
- POJ 3691 & 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: ...
- HDU 2896 病毒侵袭 AC自己主动机题解
本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...
随机推荐
- SpringBoot学习:获取yml和properties配置文件的内容(转)
项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @Configu ...
- IfSpeed 带宽计算
http://www.360doc.com/content/11/0304/22/2614615_98214710.shtml http://www.cisco.com/support/zh/477/ ...
- [Angular] Test Container component with async provider
The main idea for testing contianer component is to make sure it setup everythings correctlly. Call ...
- 正确使用pthread_create,防止内存泄漏
近日,听说pthread_create会造成内存泄漏,觉得不可思议,因此对posix(nptl)的线程创建和销毁进行了分析. 分析结果:如果使用不当,确实会造成内存泄漏. 产生根源:pthread ...
- [Ramda] Compose lenses
We can compose lenses to get value: const addrs = [{street: '99 Walnut Dr.', zip: '04821'}, {street: ...
- Android的NDK开发(1)————Android JNI简介与调用流程
1.JNI简介 JNI全称为Java Native Interface(Java本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...
- poj1066--Treasure Hunt(规范相交)
题目链接:点击打开链接 题目大意:一个正方形的墓葬内有n堵墙,每堵墙的两个顶点都在正方形的边界上,如今这些墙将墓葬切割成了非常多小空间,已知正方形内的一个点上存在宝藏,如今我们要在正方形的外面去得到宝 ...
- 5.7-基于Binlog+Position的复制搭建
基本环境 Master Slave MySQL版本 MySQL-5.7.16-X86_64 MySQL-5.7.16-X86_64 IP 192.168.56.156 192.168.56.157 ...
- 手机端自适应布局demo
原型如下: 要求如下:适应各种机型 源码如下: <!DOCTYPE html > <html> <head> <meta http-e ...
- Quartz2D常见图形的绘制:线条、多边形、圆
UI高级 Quartz2D http://ios.itcast.cn iOS学院 掌握 drawRect:方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状 ...