第一眼:什么鬼东西ヾ(。`Д´。)


第二眼:显然,这道题要分段处理 类似[TJOI2018]碱基序列\ (建议做一做也是Hash+DP)\ 那你怎么第一眼没看出来


Hash处理+DP==AC


直接上代码 (码风奇特请谅解,注释还算详细)

#include<cstdio>
#include<cstring>
#define _for(i,a,b) for(register int i=(a);i<=(b);i=-~i)
#define __for(i,a,b) for(register int i=(a);i>=(b);i=~-i)
#define Re register int
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=2147483647,N=100000+20,M=11;
inline int re(){int x=0,f=0;
char ch=getchar();
while(ch>'9'||ch<'0')
f|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
} char s1[N],s2[N];
ull hash1[110],hash2[N],p[N];
int len[110],n,cnt,hl,len2,num;
bool f[110][N];//懒得压维(按顺序处理到第几组、对应字符串中的哪一位) int main()
{
scanf("%s",s1+1);//从1开始存,个人习惯
n=re();
len[0]=strlen(s1+1);
_for(i,1,len[0])//分段
if(s1[i]=='*')//处理*和?
hash1[++cnt]='*';
else if(s1[i]=='?')
hash1[++cnt]='?';
else
if(s1[i-1]<'a'||s1[i-1]>'z')//前面不是字母,记录长度
hash1[++cnt]=s1[i]-'a'+1,len[cnt]=1;
else//前面是字母
hash1[cnt]=hash1[cnt]*131+s1[i]-'a'+1,len[cnt]++;
hl=len[0];
p[0]=1;//Hash 131进制
_for(i,1,len[0])
p[i]=p[i-1]*131;
while(n--)
{
scanf("%s",s2+1);
len2=strlen(s2+1);
_for(i,1,len2)//正常Hash
hash2[i]=hash2[i-1]*131+s2[i]-'a'+1;
memset(f,0,sizeof(f));
if(len2>hl)//小小的卡常
{
_for(i,hl+1,len2)
p[i]=p[i-1]*131;
hl=len2;
}
f[0][0]=1;//初始化!!!只初始化(0,0)
_for(i,1,cnt)
{
if(!len[i])//不是字母
{
if(hash1[i]=='?')
{//?是下一个字母任意
_for(j,0,len2)//由上一行向下转移
if(f[i-1][j])
f[i][j+1]=1;
}
else
{//*是之后的字母全任意
_for(j,0,len2)
if(f[i-1][j])
{
_for(k,j,len2)
f[i][k]=1;
break;
}
if(f[i-1][0]) f[i][0]=1;
}
continue;
}
_for(j,len[i],len2)//正常字符串匹配
if(hash1[i]==hash2[j]-hash2[j-len[i]]*p[len[i]]&&f[i-1][j-len[i]])
//一定是要能转移过来的
f[i][j]=1;
}
if(f[cnt][len2])//要求是完全匹配,所以只看放完最后一组最后一位是否能放
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
/*
观察题目,通配符不超过10个
分段
Hash
跑DP
类似[TJOI2018]碱基序列
*/

最新文章

  1. C#中将DataTable转成List
  2. html5设计原理(转)
  3. 编译android源码官方教程(2)建立编译环境「linux &amp; mac osx」
  4. sqlserver中distinct的用法(不重复的记录)
  5. 通过拆分字段优化SQL
  6. 【网络流24题】No.11(航空路线问题 最长不相交路径 最大费用流)
  7. 面向对象重写(override)与重载(overload)区别---转载“竹木人”
  8. .net 在数据访问层中写一个DBhelper优化类
  9. 第二次项目冲刺(Beta阶段)--第四天
  10. Davinci DM6446 Codec Engine双核通信环境的搭建
  11. 自动化运维:使用flask+mysql+highcharts搭建监控平台
  12. ecs云服务器 mysql经常自动停止挂掉重启问题分析
  13. Angular(03)-- lint风格规范和WebStorm小技巧
  14. 异常:NoNodeAvailableException
  15. mac下Fiddler的安装-启动
  16. 分数化小数(decimal)
  17. studio--常见设置
  18. shell脚本--逻辑判断与字符串比较
  19. mysql触发器的使用 想让b字段在更新的时候把旧数据保存到a字段中
  20. bzoj 3768: spoj 4660 Binary palindrome二进制回文串

热门文章

  1. python的惊艳之举--源于一个同事分享16种字符串反转方式
  2. NLP-transformer-分词库用法
  3. CAD中如何将图形对象转换为三维实体?
  4. docker tomcat 环境构建
  5. 什么是axios
  6. 不安全的权限 0644,建议使用 0600 虚拟机无法分配内存 virtual memory exhausted: Cannot allocate memory
  7. E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)E: 无法对目录 /var/lib/apt/lists/ 加锁
  8. Python学习笔记组织文件之将一个文件夹备份到一个zip文件
  9. 解决idea不能自动下载maven配置文件pom.xml下的jar包依赖的问题
  10. C++实现双向链表的相关操作代码