目录

题目链接

bzoj4503: 两个串

题解

暴一发bitset

f[i][j] 表示 S[1..i] 是否有个后缀能匹配 T[1..j]

那么假设 S[i+1] 能匹配 T[s],令 f[i+1][s] | = f[i][s-1]

所以预处理理出每个字符能匹配 T的哪些位置,设为[c]

那么 f[i]=((f[i-1]<<1)|(1<<1)) & mat[S[i]]

直接在mat上做匹配就好了

时间复杂度:O(|S||T|/32)

代码

  1. #include<cstdio>
  2. #include<bitset>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define LL long long
  6. #define gc getchar()
  7. #define pc putchar
  8. #define LD long double
  9. inline int read() {
  10. int x = 0,f = 1;
  11. char c = gc;
  12. while(c < '0' || c > '9' )c = gc;
  13. while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
  14. return x * f ;
  15. }
  16. void print(int x) {
  17. if(x >= 10) print(x / 10);
  18. pc(x % 10 + '0');
  19. }
  20. const int maxn = 100007;
  21. char s[maxn],t[maxn];
  22. std::bitset<maxn>mat[30],ans;
  23. int main() {
  24. scanf("%s%s",s + 1,t + 1);
  25. int n = strlen(s + 1),m = strlen(t + 1);
  26. for(int i = 1;i <= n;++ i) mat[s[i] - 'a'].set(i);
  27. ans.set();
  28. for(int i = 1;i <= m;++ i)
  29. if(t[i] != '?') ans &= (mat[t[i] - 'a'] >> (i - 1));
  30. int cnt = 0;
  31. for(int i = 1;i <= n - m + 1;++ i) if(ans[i] == 1) cnt ++;
  32. print(cnt);
  33. pc('\n');
  34. for(int i = 1;i <= n - m + 1;++ i) if(ans[i] == 1)print(i - 1),pc('\n');
  35. return 0;
  36. }

bzoj4503: 两个串 bitset的更多相关文章

  1. BZOJ4503: 两个串(bitset字符串匹配)

    题意 题目链接 Sol Orz xudyh F个毛T啊..直接bitset一波就赢了啊...(虽然复杂度很假) 就是记录匹配串中每个元素出现的位置,将第\(i\)个位置的bitset右移\(i\)位后 ...

  2. BZOJ4259: 残缺的字符串 & BZOJ4503: 两个串

    [传送门:BZOJ4259&BZOJ4503] 简要题意: 给出两个字符串,第一个串长度为m,第二个串长度为n,字符串中如果有*字符,则代表当前位置可以匹配任何字符 求出第一个字符串在第二个字 ...

  3. BZOJ4503: 两个串

    Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...

  4. BZOJ4503 两个串 多项式 FFT

    题目传送门 - BZOJ4503 题意概括 给定两个字符串S和T,回答T在S中出现了几次,在哪些位置出现.注意T中可能有?字符,可以匹配任何字符. 题解 首先,假装你已经知道了这是一道$FFT$题. ...

  5. 2019.02.06 bzoj4503: 两个串(fft)

    传送门 题意简述:给两个字符串s,ts,ts,t,ttt中可能有通配符,问ttt在sss出现的次数和所有位置. 思路:一道很熟悉的题,跟bzoj4259bzoj4259bzoj4259差不多的. 然后 ...

  6. BZOJ4503 两个串 【fft】

    题目链接 BZOJ4503 题解 水水题. 和残缺的字符串那题几乎是一样的 同样转化为多项式 同样TLE 同样要手写一下复数才A #include<algorithm> #include& ...

  7. 【BZOJ4503】两个串(FFT)

    [BZOJ4503]两个串(FFT) 题面 给定串\(S\),以及带通配符的串\(T\),询问\(T\)在\(S\)中出现了几次.并且输出对应的位置. \(|S|,|T|<=10^5\),字符集 ...

  8. 【BZOJ4503】两个串 FFT

    [BZOJ4503]两个串 Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字 ...

  9. 【bzoj4259/bzoj4503】残缺的字符串/两个串 FFT

    bzoj4259 题目描述 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有 ...

随机推荐

  1. [Fedora 20] 设置Terminal快捷键 + 设置桌面快捷方式 + Terminal透明解决方案

    一.设置Terminal快捷键 刚安装Fedora的时候,习惯性的按Ctrl+Alt+T可是终端怎么都不出来,这才意识到Fedora和Ubuntu是不一样的,于是自己设置快捷键 1.进入All set ...

  2. C++学习8-面向对象编程基础(模板)

    模板 模板是一种工具,模板可以使程序员能建立具有通用类型的函数库与类库: 模板具有两种不同的形式: 函数模板 类模板 函数模板 当一个add()函数接收两个参数,因为某种特定情况,所传入的实参数据类型 ...

  3. centos6.5下编译安装mariadb-10.0.20

    源码编译安装mariadb-10.0.20.tar.gz 一.安装cmake编译工具 跨平台编译器 # yum install -y gcc* # yum install -y cmake 解决依赖关 ...

  4. centos6.5环境使用RPM包离线安装MariaDB 10.0.20

    1. 进入MariaDB官网下载MariaDB需要的RPM包 2. 使用下载软件下载所需要的RPM包, 总共4个, 并上传到CentOS主机指定目录. MariaDB-10.0.20-centos6- ...

  5. spring boot 中的热部署

    <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>sprin ...

  6. 关卡得分(if 嵌套for)与(for嵌套if)

  7. bootstrap----几个插件网址

    1.SweetAlert (弹出框):https://github.com/t4t5/sweetalert 2.SweetAlert2 (弹出框):https://github.com/limonte ...

  8. Action属性接收参数

    一.action的属性(地址栏传参)接收参数:如果使用的JDK属性不一致,则会使得传值无法实现.解决办法:1.系统自身需要用到的JDK(window——>属性——>Java——>In ...

  9. 《转》Pragma: no-cache 对性能的影响

    做了下go和java的http性能的简单比较服务端直接输出字符串使用JMeterwindows下  2000的并发,测试结果很出乎意料,go不会这么差吧 研究了半小时,原因如下tomcat的servl ...

  10. 设置JAVA环境变量

    export JAVA_HOME=/usr/local/jdkexport JRE_HOME=/usr/local/jdk/jreexport CLASSPATH=.:$JAVA_HOME/lib/d ...