Problem - F - Codeforces

题意: 给出一个字符串,给出一个序列,每次对应位置的字符变成序列指定位置的字符,即序列中对应位置为2,那么字符串的这个位置的字符就要变成字符串第二个位置的字符,为最少进行几次可以让字符串变得和初始一样。

题解: 可以将字符串拆分成很多部分,每个部分就相当于一个环,然后求出这个环不变的最小次数,然后求出所有部分之间的最小公倍数即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=1e6+5;
ll a[N],tmp[N];
ll vis[N],p[N];
ll gcd(ll a,ll b){
if(b==0) return a;
return gcd(b,a%b);
}
ll lcm(ll a,ll b){
if(a<b) swap(a,b);
return a*b/gcd(a,b);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
ll t;cin>>t;
while(t--){
ll n;cin>>n;
char s[205];cin>>s+1;
ll ans=1;
for(ll i=1;i<=n;i++){
vis[i]=0;cin>>p[i];
}
for(ll i=1;i<=n;i++){
if(vis[i]) continue;
vis[i]=1;
string q="";
q+=s[i];
ll beg=p[i];
while(beg!=i){//找到这个环中所有的字符
q+=s[beg];
vis[beg]=1;
beg=p[beg];
}
ll cnt=(q+q).find(q,1);//因为每次交换其实都是将环内每一个位置往后进一位,所以可以将两个字符串相连,判断位置即可
ans=max(lcm(ans,cnt),ans);
}
cout<<ans<<endl;
}
}

搜索

复制

最新文章

  1. s3c2440液晶屏驱动 (非内核自带) linux-4.1.24
  2. socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
  3. sql数据库表被锁,无法查询
  4. asp.net MVC控制器中返回JSON格式的数据时提示下载
  5. 在linux中添加ftp用户,并设置相应的权限
  6. java内部类以及异常处理
  7. Java vararg(动态参数)的应用
  8. Arcgis for JS之Cluster聚类分析的实现(基于区域范围的)
  9. android 隐藏系统键盘
  10. 什么是PHP魔术引号
  11. mfc和win32区别
  12. RethinkDB
  13. 用frame实现最基本的上中下三层布局,中间又分左右两部分.
  14. js转码和解码兼容低版本火狐
  15. C#调用Java代码
  16. JSP第六篇【自定义标签之传统标签】
  17. (Sqlyog或Navicat不友好处)SHOW ENGINE INNODB STATUS 结果为空或结果为=====================================
  18. [UE4]Add Offset
  19. 关于PChar(@string)的疑惑
  20. wc语法

热门文章

  1. Operator介绍
  2. zabbix监控apache80端口
  3. 用python随随便便做一个二维码叭~~~
  4. 初学python常用,python模块安装和卸载的几种方法
  5. SLF4J 日志门面
  6. private关键字的作用及使用和this关键字的作用
  7. Cisco Packet Tracer Student(思科网络模拟器)模拟集线器和嗅探攻击
  8. gerrit系统如何配置访问控制
  9. 暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案
  10. CSS(十四):盒子模型