Let’s Swap(思维+hash)4星

题意:

已知一个长度为n的字符串SSS,可以对字符串进行一种操作:

  1. 将字符串SSS从下标i(1≤i≤n)i(1\leq i\leq n)i(1≤i≤n)的位置将串分为两个串A、BA、BA、B
  2. 将字符串SSS变为BABABA
  3. 反转字符串SSS

给你两个数a、ba、ba、b代表可以选取的下标的位置,允许操作任意次(或不操作)

问SSS是否可以通过操作变成目标串CCC

多组输入

1≤T,sum∣S∣≤5∗5101\leq T,sum|S|\leq 5*5^{10}1≤T,sum∣S∣≤5∗510

题解:

由于只能选取两个位置进行操作,考虑操作的方案:(假设a>ba>ba>b)

  • 只执行一次aaa或只执行一次bbb——按照题目所述操作即可

  • 执行多次操作

    • 显然连续选取同一位置进行操作是无效的

    • 考虑先选aaa再选bbb,用打表可知字符串操作变为:

      选择位置j=n−(a−b)j=n-(a-b)j=n−(a−b)将串SSS分为串A、BA、BA、B,将串变为BABABA

      若多次执行当前先选aaa再选bbb的操作,则字符串始终按照循环节为jjj进行操作

    • 考虑先选bbb再选aaa,同上只不过j=a−bj=a-bj=a−b

    • 考虑a、ba、ba、ba、ba...a、ba、ba、ba、ba...a、ba、ba、ba、ba...的情况,只需要求出按aaa执行一次操作的串S1S1S1,然后就变成了上面的情况

    • b、ab、ab、ab、ab...b、ab、ab、ab、ab...b、ab、ab、ab、ab...同理

如何判断三个串S、S1、S2S、S1、S2S、S1、S2是否可以通过上述操作来变成CCC?

由上述推断可得,只要我们枚举按照循环节jjj操作之后的字符串,若能得到串CCC,说明yes,否则是no

匹配字符串可以用hash来判断,因为要判断循环节,所以可以将字符串都变成二倍

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod1 1000000007
#define mod2 1000000009
#define endl '\n'
//#define int long long
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=5e5+10,P=131;
int n,m,a,b;
string s,s1,s2;
string c;
ull h[2*N],h1[2*N],h2[2*N],res;
ull p1[2*N],p2[2*N];
ull work(ull h[],int l,int r){return h[r]-h[l-1]*p1[r-l+1];
}
bool get(int l,int r){if(work(h,l,r)==res){//cout<<l<<' '<<r<<" 1"<<endl;return true;} if(work(h1,l,r)==res){//cout<<l<<' '<<r<<" 2"<<endl;return true;}if(work(h2,l,r)==res){//cout<<l<<' '<<r<<" 3"<<endl;return true;}return false;
}
void solve(){cin>>s>>c>>a>>b;n=s.size();//构造串S1、S2s1=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());//求出每个串的hash值s=s+s,s="#"+s;s1=s1+s1,s1="#"+s1;s2=s2+s2,s2="#"+s2;c="#"+c;h[0]=h1[0]=h2[0]=0;p1[0]=1,p2[0]=1;res=0;for(int i=1;i<=2*n;i++){p1[i]=p1[i-1]*P;h[i]=h[i-1]*P+s[i]-'a'+1;h1[i]=h1[i-1]*P+s1[i]-'a'+1;h2[i]=h2[i-1]*P+s2[i]-'a'+1; if(i<=n) res=res*P+c[i]-'a'+1;}//按照循环节来判断是否可以变成Cif(a<b) swap(a,b);for(int i=1,j=1;j<=n;j++){if(get(i,i+n-1)){cout<<"yes"<<endl;return ;}i=i+n-a+b;if(i>=n+1) i=i%(n+1)+1;}for(int i=1,j=1;j<=n;j++){if(get(i,i+n-1)){cout<<"yes"<<endl;return ;}i=i+a-b;if(i>=n+1) i=i%(n+1)+1;}cout<<"no"<<endl;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T=1;cin>>T;while(T--){solve();} return 0;
}
/*
1
abcde
abcde
1 2
*/

“统信杯” 第十七届黑龙江省大学生程序设计竞赛 Let‘s Swap相关推荐

  1. “统信杯” 第十七届黑龙江省大学生程序设计竞赛

    "统信杯" 第十七届黑龙江省大学生程序设计竞赛 前言 题目 A. Bookshelf Filling C. Tree Division D. Collision Detector ...

  2. 浙江省计算机程序比赛员,计算机学子在“图森未来杯”第十七届浙江省大学生程序设计竞赛中斩获金奖...

    由浙江省大学生程序设计竞赛委员会主办,杭州师范大学承办,于 2020 年 10 月 17 日举办了"图森未来杯"第十七届浙江省大学生程序设计竞赛.来自全省的70所高校的404支本专 ...

  3. 黑龙江计算机比赛,第十二届东北地区大学生程序设计竞赛和第十三届黑龙江省大学生程序设计竞赛在我校成功举行...

    2018年5月18日至20日,第十三届黑龙江省大学生程序设计竞赛和第十二届东北地区大学生程序设计竞赛在我校隆重举行.副校长刘胜辉.教务处长宋清昆分别代表组委会致欢迎辞,并宣布比赛开幕.黑龙江省计算机学 ...

  4. 计算机信息技术奥赛实践,我校计算机科学与信息技术学院学生在黑龙江省大学生程序设计竞赛中取得优异成绩...

    原标题:我校计算机科学与信息技术学院学生在黑龙江省大学生程序设计竞赛中取得优异成绩 5月12日,由黑龙江省计算机学会主办.哈尔滨工业大学承办的第十四届黑龙江省大学生程序设计竞赛在哈尔滨工业大学举行,来 ...

  5. 华农c语言程序设计教程陈湘骥,华农数信学子在第44届国际大学生程序设计竞赛勇夺金牌...

    数信学子在第44届国际大学生程序设计竞赛勇夺金牌 中国区决赛 上海站 南京站 哈尔滨站 近日,第44届国际大学程序设计竞赛(中国区决赛)在西北工业大学落下帷幕.我校数学与信息学院.软件学院的张宏海.何 ...

  6. 挑战程序设计竞赛_我系首次参加第六届中国大学生程序设计竞赛网络预选赛

    点击上方蓝字关注  「龙外信息工程系」 讲述有温度的故事    传递有态度的思想 2020年9月20日12时至17时,第六届中国大学生程序设计竞赛网络赛预选赛在杭州电子科技大学OJ成功举办,黑龙江外国 ...

  7. 第45届国际大学生程序设计竞赛(ICPC)银川站太原理工大学收获4枚奖牌

    第45届国际大学生程序设计竞赛(ICPC)银川站,由宁夏理工学院承办,于2021年5月15-16日在宁夏的石嘴山市进行. 太原理工大学在比赛中获得2银2铜共4枚奖牌的好成绩. 参加本次比赛的四个队,涵 ...

  8. 2020 年第一届辽宁省大学生程序设计竞赛

    2020 年第一届辽宁省大学生程序设计竞赛 A-组队分配 分析 代码 B-两点距离 分析 代码 C-轮到谁了? 分析 代码 F-最长回文串 分析 代码 G-管管的幸运数字 分析 代码 I-鸽子的整数运 ...

  9. 第九届广东省大学生程序设计竞赛排名

    第 九 届广东省大学生程序设计竞赛 ( GDCPC 201 1 , ACM/ICPC 广东省赛) 成绩公告 201 1 年 5 月 8 日 第 九 届广东省大学生程序设计竞赛( GDCPC'201 1 ...

最新文章

  1. 修改MySql默认存储引擎为InnoDB,启动报错
  2. BCH易于使用不只是说说而已
  3. Java数据结构和算法:字符串、数组和广义表
  4. [Silverlight]使用MVVM模式打造英汉词典
  5. SQL Server 分布式数据库的问题和解决方法
  6. iOS-NSData与NSDictionary的互相转换
  7. 从前中后序遍历构造二叉树,三题无脑秒杀
  8. 华罗庚的数学有多厉害?靠报纸上的一个四边形算出导弹基地的位置
  9. 【微信插件】P3微信插件测试使用步骤
  10. SSH连接慢与反向解析(转)
  11. linux安装oracle tar,在linux as4上用tar方式安装oracle 10g步骤教程-Oracle
  12. Kafka详解与总结(七)-Kafka producer拦截器(interceptor)
  13. ADO 错误:0x80004005,连接字符串属性无效
  14. 高斯混合模型聚类_高斯混合模型的解释及Python实现
  15. 软件开发架构与网络编程
  16. 解决Edge不兼容onpropertychange的方法
  17. 阿里云网站域名备案注销方法
  18. 删除后别人的微信号变成wxid_“重新做人”?安卓版微信支持修改微信号,网友:哭了...
  19. 奇特的锡纸海鲜小吃:吃到嗨都不会发胖的辣卤海鲜!值得开一家哦!
  20. ZBrush如何进行头骨的雕刻

热门文章

  1. TPS793475DBVREP
  2. 你说学习重要,还是经营人脉重要
  3. python日常记账本源代码,基于PySide6,支持快速查询、绘制图表
  4. 命题公式的主合取范式C语言,程序设计题: 命题逻辑应用系统
  5. LINUX选定区域截图
  6. java scala_1400万美元的资本资金,Scala准备接受Java
  7. Java入门云计算:从基础到实践
  8. 解决办法 Field userService in com.sxsj.controller.RegistLoginController required a bean of type
  9. php支持链式操作,PHP三种方式实现链式操作-php教程
  10. 区块链 — 默克尔树