CodeForces - 1690F
2024-09-08 06:56:56
题意: 给出一个字符串,给出一个序列,每次对应位置的字符变成序列指定位置的字符,即序列中对应位置为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;
}
}
搜索
复制
最新文章
- s3c2440液晶屏驱动 (非内核自带) linux-4.1.24
- socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
- sql数据库表被锁,无法查询
- asp.net MVC控制器中返回JSON格式的数据时提示下载
- 在linux中添加ftp用户,并设置相应的权限
- java内部类以及异常处理
- Java vararg(动态参数)的应用
- Arcgis for JS之Cluster聚类分析的实现(基于区域范围的)
- android 隐藏系统键盘
- 什么是PHP魔术引号
- mfc和win32区别
- RethinkDB
- 用frame实现最基本的上中下三层布局,中间又分左右两部分.
- js转码和解码兼容低版本火狐
- C#调用Java代码
- JSP第六篇【自定义标签之传统标签】
- (Sqlyog或Navicat不友好处)SHOW ENGINE INNODB STATUS 结果为空或结果为=====================================
- [UE4]Add Offset
- 关于PChar(@string)的疑惑
- wc语法