题意:给你一个模式串和一堆长度相同的不相同的匹配串,问是否有一个方案可以让这个模式串由这些匹配串首尾相连组成,每个串只能出现一次.

思路:还是比较简单的,显然模式串每个位置最多匹配一个匹配串,因为所有的匹配串严格不同,每个位置有没有匹配哪个匹配串用ac自动机很容易就能跑出来,然后枚举一下位置就ok,还有模式串应该在开头加上尾部的一些字符,因为要求的是这个模式串要看成一个环.

 #include <bits/stdc++.h>
using namespace std;
char aim[];
int pos[];
char temp[];
int total;
struct Root
{
Root *next[];
int count;
Root *fail;
Root()
{
for(int i=; i<; i++)
next[i]=NULL;
fail=NULL;
count=;
}
};
queue<Root *>q;
class AC_auto
{
public:
AC_auto();
void insert(char object[],int num);
void ac_auto();
void match(char aim[]);
private:
Root *root;
};
AC_auto::AC_auto()
{
root=new Root();
}
void AC_auto::insert(char object[],int num)
{
int len=strlen(object);
Root *temp=root;
for(int i=; i<len; i++)
{
if(temp->next[object[i]-'a']==NULL)
{
Root *temp1=new Root();
temp->next[object[i]-'a']=temp1;
}
temp=temp->next[object[i]-'a'];
}
temp->count=num;
}
void AC_auto::ac_auto()
{
while(!q.empty())q.pop();
q.push(root);
Root *temp1,*temp2;
while(!q.empty())
{
temp1=q.front();
q.pop();
for(int i=; i<; i++)
{
if(temp1->next[i])
{
if(temp1==root)
temp1->next[i]->fail=root;
else
{
temp2=temp1->fail;
while(temp2)
{
if(temp2->next[i])
{
temp1->next[i]->fail=temp2->next[i];
break;
}
temp2=temp2->fail;
}
if(temp2==NULL)
temp1->next[i]->fail=root;
}
q.push(temp1->next[i]);
}
}
}
}
void AC_auto::match(char aims[])
{
int len=strlen(aims);
Root *temp1,*temp=root;
for(int i=; i<len; i++)
{
if(aims[i]>'z'||aims[i]<'a')
{
temp=root;
continue;
}
while(temp->next[aims[i]-'a']==NULL&&temp!=root)
temp=temp->fail;
temp=temp->next[aims[i]-'a'];
if(!temp)temp=root;
if(temp->count)
pos[i]=temp->count;
}
}
bool sign[];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",aim+k);
for(int i=;i<k;i++)
aim[i]=aim[(n+)*k-k+i];
AC_auto *ac_auto=new AC_auto();
int g;
scanf("%d",&g);
for(int i=;i<=g;i++)
{
scanf("%s",temp);
ac_auto->insert(temp,i);
}
ac_auto->ac_auto();
ac_auto->match(aim);
for(int i=k;i<*k;i++)
{
for(int j=i;j<n*k+k;j+=k)
{
if(pos[j]==)
break;
else if(sign[pos[j]])
break;
sign[pos[j]]=true;
if(j+k>=n*k+k)
{
printf("YES\n");
for(int j=i;j<n*k+k;j+=k)
printf("%d ",pos[j]);
return ;
}
}
for(int j=i;j<n*k+k;j+=k)
{
if(pos[j]==)
break;
sign[pos[j]]=false;
}
}
printf("NO\n");
return ;
}

cf727e的更多相关文章

  1. 【CodeForces727E/CF727E】Games on a CD (字符串哈希)

    题目: CodeForces727E 分析: 看到字符串比较,肯定想到哈希啊--现学的哈希,先丢两个重要的公式 (\(seed\)是大于字符集大小的质数,\(p\)是大质数) \[hash[i]=(h ...

随机推荐

  1. jquery “做页面滚动到某屏时改变状态标题” 所用知识点记录

    浏览器滚动条滚动时触发事件 //浏览器滚动条滚动时触发事件 $(window).scroll(function(){}); 浏览器窗口大小改变时触发事件 //浏览器窗口大小改变时触发事件 $(wind ...

  2. 进程物理内存远大于Xmx的问题分析

    问题描述 最近经常被问到一个问题,”为什么我们系统进程占用的物理内存(Res/Rss)会远远大于设置的Xmx值”,比如Xmx设置1.7G,但是top看到的Res的值却达到了3.0G,随着进程的运行,R ...

  3. linux下配置ip地址四种方法(图文方法)

    主要是用第四种方法 (1)Ifconfig命令  第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ...

  4. Flasky学习笔记(一)

    1. app.run(debug=True,host='10.0.2.15',port=8000)自定义host及port;

  5. Struts2:MyEclippse中使用struts-default.xml中定义的拦截器(timmer,logger)

    环境:MyEclipse 2015 Stable 2.0:struts2-core-2.3.16.1.jar等 struts.xml <struts> <package name=& ...

  6. 1、B2BUA

    链接1:proxy和B2BUA的区别和联系:http://www.cnblogs.com/gnuhpc/archive/2012/12/11/2813499.html 链接2:http://blog. ...

  7. xcode 8   去除无用打印信息

    更新Xcode8之后,控制台会默认打印一坨东西,屏蔽的方法如下:Xcode8里边 Edit Scheme-> Run -> Arguments, 在Environment Variable ...

  8. Python交互式编程导论----事件驱动编程

    传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束 每一个代码块里是完成各种各样事情 ...

  9. 常见寻找OEP脱壳的方法

    方法一: 1.用OD载入,不分析代码! 2.单步向下跟踪F8,是向下跳的让它实现 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选) 4.绿色线条表 ...

  10. EBS中后台AP发票审批脚本

    Declare    l_Hold_Count Number;    l_Funds_Code Varchar2(30);      l_Approve_Status Varchar2(120); B ...