题意:

给你两个字符串S,T。

对于每个T长度的S子串,你需要求出他们的“距离”。

你每次可以将一个字符变成另一个字符,对于两个串都变,距离就是变化次数最小值使得两串相同。

字符集a - f。

题解:

如果长度相同,和CF另一题一模一样,只要把同一位置的两个字符连边,然后并查集一下就可以了。

现在还是一样,只是多了FFT,我们枚举转换字符i, j, 6 * 6 = 36种,然后把S中所有i字符变成1,其他的为0, T中所有j字符变成1,其他的为0。然后跑FFT,res[i]>0代表有这种边。

代码:

#include <bits/stdc++.h>
#ifdef LOCAL
#define debug(x) cout<<#x<<" = "<<(x)<<endl;
#else
#define debug(x) 1;
#endif#define chmax(x,y) x=max(x,y)
#define chmin(x,y) x=min(x,y)
#define lson id<<1,l,mid
#define rson id<<1|1,mid+1,r
#define lowbit(x) x&-x
#define mp make_pair
#define pb push_back
#define fir first
#define sec second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const int MOD = 1e9 + 7;
const double PI = acos (-1.);
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const int MAXN = 3e5 + 5;char s[MAXN], t[MAXN];int par[MAXN][7];int Find (int x, int i) {return x == par[i][x] ? x : par[i][x] = Find (par[i][x], i);
}int Union (int x, int y, int i) {int xx = Find (x, i), yy = Find (y, i);if (xx != yy) {par[i][xx] = yy;return 1;}return 0;
}//typedef complex<double> CP;
struct CP {double x, y;CP() {}CP (double x, double y) : x (x), y (y) {}inline double real() {return x;}inline CP operator * (const CP& r) const {return CP (x * r.x - y * r.y, x * r.y + y * r.x);}inline CP operator - (const CP& r) const {return CP (x - r.x, y - r.y);}inline CP operator + (const CP& r) const {return CP (x + r.x, y + r.y);}inline CP conj (const CP &r) {return CP (r.x, -r.y);}
};
CP a[MAXN], b[MAXN];
int r[MAXN], res[MAXN];
void fft_init (int nm, int k) {
// Rader 操作for (int i = 0; i < nm; ++i) r[i] = (r[i >> 1] >> 1) | ( (i & 1) << (k - 1) );
}
void fft (CP ax[], int nm, int op) {for (int i = 0; i < nm; ++i) if (i < r[i]) swap (ax[i], ax[r[i]]);for (int h = 2, m = 1; h <= nm; h <<= 1, m <<= 1) { // 枚举长度CP wn = CP (cos (op * 2 * PI / h), sin (op * 2 * PI / h) );for (int i = 0; i < nm; i += h) { // 枚举所有长度为 h 的区间CP w (1, 0); // 旋转因子for (int j = i; j < i + m; ++j, w = w * wn) { // 枚举角度CP t = w * ax[j + m]; // 蝴蝶操作ax[j + m] = ax[j] - t;ax[j] = ax[j] + t;}}}if (op == -1) for (int i = 0; i < nm; ++i) ax[i].x /= nm;
}
void trans (int ax[], int bx[], int n, int m) {int nm = 1, k = 0;while (nm < 2 * n || nm < 2 * m) nm <<= 1, ++k;for (int i = 0; i < n; ++i) a[i] = CP (ax[i], 0);for (int i = 0; i < m; ++i) b[i] = CP (bx[i], 0);for (int i = n; i < nm; ++i) a[i] = CP (0, 0);for (int i = m; i < nm; ++i) b[i] = CP (0, 0);fft_init (nm, k);fft (a, nm, 1);fft (b, nm, 1);for (int i = 0; i < nm; ++i) a[i] = a[i] * b[i];fft (a, nm, -1);nm = n + m - 1;for (int i = 0; i < nm; ++i) res[i] = (int) (a[i].real() + 0.5);
}int ax[MAXN], bx[MAXN];
int ans[MAXN];int main() {
#ifdef LOCALfreopen ("input.txt", "r", stdin);
#endifscanf ("%s %s", s + 1, t + 1);int n = strlen (s + 1), m = strlen (t + 1);reverse (t + 1, t + 1 + m);for (int i = 1; i <= n; i++) for (int j = 0; j < 7; j++) par[i][j] = j;for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {for (int k = 1; k <= n; k++) ax[k] = s[k] == i + 'a';for (int k = 1; k <= m; k++) bx[k] = t[k] == j + 'a';trans (ax, bx, n + 1, m + 1);for (int k = m + 1; k <= n + 1; k++) if (res[k]) ans[k - m] += Union (i, j, k - m);}}for (int i = 1; i <= n - m + 1; i++) printf ("%d ", ans[i]);return 0;
}

CF 954I - Yet Another String Matching Problem FFT 字符串相关推荐

  1. CF954I Yet Another String Matching Problem 并查集、FFT

    传送门 题意:给出两个由小写$a$到$f$组成的字符串$S$和$T$($|S| \geq |T|$),给出变换$c1\,c2$表示将两个字符串中所有$c1$字符变为$c2$,求$S$的每一个长度为$T ...

  2. string matching(HDU-6629)

    Problem Description String matching is a common type of problem in computer science. One string matc ...

  3. String Matching 字符串匹配算法——干货从头放到尾

    需要的先验知识:动态规划,有限状态机,搜索算法(就是含有state,action和policy)的模型,java.上面这些不需要知道很细,大概懂这些都是啥就可以读懂本文. 写这篇技术博客的动机是因为做 ...

  4. 南阳5--Binary String Matching(Kmp)

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alpha ...

  5. nyoj 题目5 Binary String Matching

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alpha ...

  6. Binary String Matching

    Binary String Matching 描述 Given two strings A and B, whose alphabet consist only '0' and '1'. Your t ...

  7. KY91 String Matching

    KY91 String Matching 版本一:暴力解法 "版本一:暴力解法"import sys for line in sys.stdin:line = line.strip ...

  8. NYOJ Binary String Matching的stl解法 酒馆浪人的博客

    Binary String Matching 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3 描述 Given two strings A and B, whose al ...

  9. Problem B: 字符串加密(编程)

    Problem B: 字符串加密(编程) Time Limit: 1 Sec Memory Limit: 2 MB Submit: 1923 Solved: 905 [Submit][Status][ ...

最新文章

  1. 图的单源最短路径,Floyd算法(数据结构c++)
  2. 电容二极管升压电路分析
  3. 预训练模型:BERT深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
  4. iOS之深入解析事件传递的响应链
  5. C语言反序输出英文句子,C++实现英文句子中的单词逆序输出的方法
  6. ASP防止SQL注入
  7. Spring Boot 是什么,有什么用。
  8. UI设计灵感|购物界面更有吸引力
  9. Scala: 简介和安装
  10. 【20保研】四川大学视觉合成图形图像技术国防重点学科实验室2019年全国优秀大学生暑期夏令营招生简章...
  11. 使用USB Key Utility工具制作bootable USB Key
  12. Python爬虫之实习僧招聘信息及数据分析
  13. python设置Excel单元格的数据有效性
  14. thinkphp如何调试,打印错误信息sql等
  15. IDL---批量波段合成(只要点击运行,自动化处理,解放生产力)
  16. linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...
  17. ES的mapping配置详解
  18. Android-蓝牙sco通话
  19. Mac小技巧:同时选中多个文件
  20. 网上千万不要在非官方直营店铺买的商品排行榜

热门文章

  1. android 21什么手机,有你的吗?这21款手机将率先尝鲜安卓Q
  2. C语言,给定字符串,切分输出
  3. Matlab中将数据保存为txt或dat格式四种方法
  4. 企业管理者不得不看!现在的大企业都是怎么做文档管理的?
  5. 房产中介APP开发需要哪些功能|房产中介app开发多少钱?
  6. 吉林大学计算机初剑锋,RC4算法的密码分析与改进.pdf
  7. 利用anjs新闻关键词的抓取
  8. Golang语言环境安装
  9. 市面上Word转化PDF,PDF转图片Java实现方案(亲测)
  10. 路由器回执路由配置_【必须收藏】终于不求人,详细图文教您设置无线路由器...