题目链接

BZOJ4503

题解

水水题。
和残缺的字符串那题几乎是一样的
同样转化为多项式
同样TLE
同样要手写一下复数才A

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<complex>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 400005,maxm = 100005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
struct E{double a,b;E(){}E(double x,double y):a(x),b(y) {}E(int x,int y):a(x),b(y) {}inline E operator =(const int& b){this->a = b; this->b = 0;return *this;}inline E operator =(const double& b){this->a = b; this->b = 0;return *this;}inline E operator /=(const double& b){this->a /= b; this->b /= b;return *this;}
};
inline E operator *(const E& a,const E& b){return E(a.a * b.a - a.b * b.b,a.a * b.b + a.b * b.a);
}
inline E operator *=(E& a,const E& b){return a = E(a.a * b.a - a.b * b.b,a.a * b.b + a.b * b.a);
}
inline E operator +(const E& a,const E& b){return E(a.a + b.a,a.b + b.b);
}
inline E operator -(const E& a,const E& b){return E(a.a - b.a,a.b - b.b);
}
const double pi = acos(-1);
int R[maxn];
void fft(E* a,int n,int f){for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]);for (int i = 1; i < n; i <<= 1){E wn(cos(pi / i),f * sin(pi / i));for (int j = 0; j < n; j += (i << 1)){E w(1,0),x,y;for (int k = 0; k < i; k++,w = w * wn){x = a[j + k],y = w * a[j + k + i];a[j + k] = x + y; a[j + k + i] = x - y;}}}if (f == -1) for (int i = 0; i < n; i++) a[i] /= n;
}
E A[maxn],B[maxn];
int N,M,L,ans[maxn],ansi;
double C[maxn];
char S[maxn],T[maxn];
int main(){scanf("%s",S); N = strlen(S);scanf("%s",T); M = strlen(T);reverse(T,T + M);int n,m; double t;m = N - 1 + M - 1; L = 0;for (n = 1; n <= m; n <<= 1) L++;for (int i = 1; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));for (int i = 0; i < N; i++){t = S[i] - 'a' + 1;A[i] = t * t;}for (int i = 0; i < M; i++)if (T[i] == '?') B[i] = 0;else B[i] = T[i] - 'a' + 1;fft(A,n,1); fft(B,n,1);for (int i = 0; i < n; i++) A[i] *= B[i];fft(A,n,-1);for (int i = 0; i < N; i++) C[i] += floor(A[i].a + 0.5);for (int i = 0; i < N; i++) A[i] = 1;for (int i = N; i < n; i++) A[i] = 0;for (int i = 0; i < M; i++)if (T[i] == '?') B[i] = 0;else {t = T[i] - 'a' + 1;B[i] = t * t * t;}for (int i = M; i < n; i++) B[i] = 0;fft(A,n,1); fft(B,n,1);for (int i = 0; i < n; i++) A[i] *= B[i];fft(A,n,-1);for (int i = 0; i < N; i++) C[i] += floor(A[i].a + 0.5);for (int i = 0; i < N; i++)A[i] = S[i] - 'a' + 1;for (int i = N; i < n; i++) A[i] = 0;for (int i = 0; i < M; i++)if (T[i] == '?') B[i] = 0;else {t = T[i] - 'a' + 1;B[i] = t * t;}for (int i = M; i < n; i++) B[i] = 0;fft(A,n,1); fft(B,n,1);for (int i = 0; i < n; i++) A[i] *= B[i];fft(A,n,-1);for (int i = 0; i < N; i++) C[i] -= 2 * floor(A[i].a + 0.5);for (int i = M - 1; i < N; i++)if (fabs(C[i]) < 0.1) ans[++ansi] = i - M + 1;printf("%d\n",ansi);REP(i,ansi) printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9112828.html

BZOJ4503 两个串 【fft】相关推荐

  1. Bzoj4503 两个串

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 398  Solved: 190 Description 兔子们在玩两个串的游戏.给定两个字符串S和T ...

  2. BZOJ4503:两个串(bitset)

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

  3. bzoj4503: 两个串

    我又变成sb了 首先通过%可以得到一个这样的柿子: 设s1是模版串,s2是匹配串,j表示模版串以j为起始的子串 fj(0<j<=s1len-s2len) =sigema(i=0~s2len ...

  4. hdu 1867 求两个串的和最小 ,KMP

    题意:       给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...

  5. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  6. 递归法:求两个串的最大公共子序列的长度

    问题:求两个串的最大公共子序列的长度 举例: 子串: abcgxs 与sabxfh 其最大公共子序列的为abx,长度为3 public class Zixulie {public static int ...

  7. Simpsons’ Hidden Talents(KMP ,两个串的前后缀匹配)

    Simpsons' Hidden Talents 题目 给两个串,求S1的前缀和S2的后缀的最大匹配 思路 拼接两个串,处理出nxt数组,nxt[k] 即为所求,因为它们的最大匹配不能超过原串的长度, ...

  8. 题6:两个串的字符集是否相等

    题目: 只要出现的字符集相同就相等,不在乎数量. 思路: 借助辅助数组,先扫描第一个字符串,将出现的字符转换为辅助数组的下标并标记为1 package 字符串问题;import java.util.H ...

  9. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

最新文章

  1. TSP_遗传算法求解
  2. python爬虫脚本ie=utf-8_Python网络爬虫出现乱码问题的解决方法
  3. 如果今天设计了Java:同步接口
  4. python调用cmd命令释放端口_详解python调用cmd命令三种方法
  5. 使用jmap命令手动导出映像文件?
  6. Visual Studio Code 显示隐藏的.git文件和目录
  7. 一个阿拉伯数字转中文数字的函数
  8. 天翼网关F452超级密码获取(亲测有效)
  9. 用C语言学习高中数学:补集
  10. Git 如何撤回已经push到远端上的代码
  11. Monte Carlo Counterfactual Regret Minimization
  12. 成从武:其他人绕不开高德
  13. 基于Nordic52832的六轴HID蓝牙鼠标开发
  14. request库单一视频下载
  15. 基于ABP实现DDD
  16. 了解 什么是 22 端口
  17. js 时间戳与日期时间的相互转换
  18. 202012-5 星际旅行 C++暴力80分
  19. 万字长文,62道Java核心面试题,一次性打包送给积极向上的你
  20. c语言中为什么有时候输入一个数字之后要再输入一个才输出结果

热门文章

  1. linux gtest安装
  2. Laravel5.5之事件监听、任务调度、队列
  3. Linux中断 - tasklet
  4. sourcetree不好做到的一些git操作
  5. hive cli启动判断hadoop version的问题
  6. 烂泥:【解决】word复制windows live writer没有图片
  7. 宋体配置JAVA j2ee (一) 轻松入门
  8. Adobe Dreamweaver 添加库、标签和属性
  9. Visual Studio 2010授权修改
  10. NoSuchElementException