L - Let‘s Swap(哈希 + 规律)
2023河南省赛组队训练赛(四) - Virtual Judge (vjudge.net)
约瑟夫最近开发了一款名为Pandote的编辑软件,现在他正在测试,以确保它能正常工作,否则,他可能会被解雇!Joseph通过实现对Pandote上字符串的复制和粘贴以及反向操作开始了他的测试。更具体地说,在每一步中,如果屏幕上的字符串是S,他将按顺序进行以下操作。1. 选择长度为l(1≤l≤IS)的前缀,则S可表示为AB (IA] = 1),注意字符串B可以为空。2. 交换这两个部分,得到字符串BA。3.反转整个字符串,得到字符串(BA)"但是,由于Pandote的功能有限,他在每一步中只能选择长度不同的前缀l1和l2。现在Joseph想知道他是否可以通过几个(可能是零)步骤将字符串S转换为T。输入输入的第一行给出了测试用例的数量T (1 <T <5 × 105)。接下来是T测试用例。对于每个测试用例,第一行包含字符串S,第二行包含字符串T。S和T都由小写拉丁字母和[S] = ITI组成。第三行包含两个整数l1和l2(1≤l1, l2≤IS1, l1 # 12),表示每一步可以选择的前缀长度。保证所有测试用例的|S]之和不超过5 × 105。
Sample 1
Inputcopy | Outputcopy |
---|---|
3 ljhelloh hellohlj 2 4 thisisastr htrtsasisi 3 5 abcde bcdea 1 4 |
yes no yes |
题解:
我们通过枚举样例可以发现如果连续两个l1或l2操作,原字符串是不变的
(假设l1 > l2)
并且如果进行(l1,l2)
相当于把字符串向左(先l1后 l2) l1 - l2个单位
或向右移动(先l2 后l1) l1 - l2个单位
那么最终答案只可能会是
(l1,l2),l1,l2... 只在原字符串上进行向左或向右移动
l1,(l1,l2),(l1,l2)... 先进行一次l1,再同上
l2,(l1,l2),(l1,l2)... 先进行一次l2,在同上
由于我们要找循环节,所以字符串都变成二倍长度
然后哈希三种情况,看字符串T是否在三种情况中出现过
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<set>
using namespace std;
#define int long long
const int N = 4e6 + 10;
typedef pair<int, int> PII;
string s,s1,s2,c;
int n,m,a,b;
int h1[N],h2[N],h[N],p[N];
int x = 133331;
int mod = 1e9 + 7;
int res;
int get(int h[],int l,int r)
{return (h[r] - h[l-1]*p[r-l+1]%mod + mod)%mod;
}
int check(int l,int r)
{if(get(h,l,r) == res)return 1;if(get(h1,l,r) == res)return 1;if(get(h2,l,r) == res)return 1;return 0;}
void solve()
{cin >> s >> c >> a >> b;n = s.size();s1 = s.substr(a) + s.substr(0,a);reverse(s1.begin(),s1.end());s2 = s.substr(b) + s.substr(0,b);reverse(s2.begin(),s2.end());s = s + s;s = " " + s;s1 = s1 + s1;s1 = " " + s1;s2 = s2 + s2;s2 = " " + s2;c = " " + c;res = 0;p[0] = 1;for(int i = 1;i <= 2*n;i++){p[i] = (p[i-1]*x%mod);h[i] = (h[i-1]*x%mod + s[i])%mod;h1[i] = (h1[i-1]*x%mod + s1[i])%mod;h2[i] = (h2[i-1]*x%mod + s2[i])%mod;if(i <= n)res = (res*x%mod + c[i])%mod;}if(a < b)swap(a,b);for(int i = 1,j = 1;j <= n;j++){if(check(i,i+n - 1)){cout <<"yes\n";return ;}i = i + n - a + b;if(i >= n + 1){i = i%(n);if(!i)i = n;}}for(int i = 1,j = 1;j <= n;j++){if(check(i,i+n - 1)){cout <<"yes\n";return ;}i = i + a - b;if(i >= n + 1){i = i%(n);if(!i)i = n;}}cout <<"no\n";
}signed main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);int t = 1;cin >> t;
//scanf("%lld",&t);while (t--) {solve();}
}
//3 F
//5 B
//6 F
//9 F
//10 B
//12 F
//15 FB
//18 FB
L - Let‘s Swap(哈希 + 规律)相关推荐
- 请编程输出如下规律的N*N方阵。*UUUUUUUU*L*UUUUUU*RLL*UUUU*RRLLL*UU*RRRLLLL**RRRRLLLL**RRRRLLL*D
###方阵 请编程输出如下规律的N*N方阵.(此题由黄玉妍老师提供) *UUUUUUUU* L*UUUUUU*R LL*UUUU*RR LLL*UU*RRR LLLL**RRRR LLLL**RRRR ...
- 【学术篇】规律选手再次证明自己(舒老师的胡策题 T2 LX还在迷路)
只要你不强制在线, 我就能分块. --Reflash 就算你强制在线, 我还是要分块. --Enzymii 今天做了一波舒老师的毒瘤题, T1据说很水但是没思路所以直接放掉了.. 去看了看T2好像可以 ...
- 学习超大神经网络,CPU超越V100 GPU,靠的居然是哈希?
机器之心报道 机器之心编辑部 训练一亿参数量的全连接网络,44 核心 CPU 让 V100 甘拜下风,靠的居然是--哈希? 深度学习模型的训练和推理加速近来是研究领域关注的重点.虽然普遍观点认为,GP ...
- 哈希表(散列表)的介绍,代码实现
百度百科介绍的哈希表: 哈希表(Hash table,也叫散列表):是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访 ...
- Ubuntu增加(swap)交换分区
2019独角兽企业重金招聘Python工程师标准>>> Ubuntu增加(swap)交换分区 内存512M.装的 vpn,lamp,在用vpn时会断线,原来是内存不足引起的.加入sw ...
- poj 3257(哈希+二维dp)
题意:要连出一个从1-L的过山车线,给出n段可选的建设方案.每段都有起始位置,终止位置,代价,和乐趣程度.要实现1-L的长度中,相邻两端要首尾相连,总建设代价控制在B之内,问最多能获得多少乐趣程度. ...
- 《Effective C++》item25:考虑写出一个不抛异常的swap函数
std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _T ...
- 数据结构学习笔记(七):哈希表(Hash Table)
目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...
- linux增加分区swap,linux中Centos7增加swap分区详解
注意:(Redhat5官方推荐) RAM<=4G,swap=2G;RAM>4G,<16G,swap=4G;RAM>16G,<64G,swap=8G;RAM>64G, ...
最新文章
- flink入门_阿里巴巴为何选择Flink?20年大佬分11章讲解Flink从入门到实践!
- CTF-python-trade-加密的逆写
- 本体开发方法——the Method of Ontology Development
- 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结
- python元组的定义方式_学习Python元组,有哪些必须要掌握的内容
- macbook视频格式转换_AnyMP4简易视频格式转换器 for mac | MAC之家
- linux谁使用内存,linux内存不知被谁用了
- django 获取环境变量_python – django settings.py os.environ.get(“X”)没有获取正确的值...
- C++基础::Stream
- Unity直接调用Python脚本
- 古建筑测绘任重道远,三维实景建模是唯一突破口?
- 6-9.添加HLSL镜面高光
- 前端面试题 Doctype作用是什么?严格模式与混杂模式如何区分?他们之间有何意义?
- gin embed打包静态资源文件
- alpha测试和beta测试
- 【中亦安图】Oracle内存过度消耗风险提醒(6)
- Java Stream 流常用方法 lambda 表达式实现交集、并集、差集、去重复并集等
- Winform开发框架之介绍
- 33复杂美:一文看懂加密算法为何物
- java代码异常处理会影响性能_编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理...