http://acm.hdu.edu.cn/showproblem.php?pid=2371

题意:给出一个长度为n的字符串(标号为1~n),以及n个数代表字符串的变换规则,问该字符串是由哪个字符串按照变换规则变换m次得到的?如n=5,m=3,变换规则 2 3 1 5 4 (生成的下一个字符串即按照此标号的顺序对应的串), “hello" -> "elhol" -> "lhelo" -> "helol", 故helol 是由"hello''变换3次得到的。

思路:此类型的题目一般是找循环节,但是此题不能找字符串的循环节,因为数据范围太大,找字符串的循环节会超时。由于只有80个字符,所以可以找每个字符的循环节,并在查找过程中记录下来该字符在变换t次后所在的位置,这样就能通过m对循环节取余,找到该字符在目标串中的位置。

 #include <stdio.h>
#include <string.h>
const int N=;
int pos[N][N],p[N];
char str[N],s[N];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
if (n==&&m==)
break;
for (int i = ; i < n; i++)
{
scanf("%d%*c",&p[i]);
p[i]--;
}
gets(s);
for (int i = ; i < n; i++)
{
int j = p[i];
int cnt = ;
pos[i][cnt++] = i;
while(j!=i)//找第i个字符的循环节
{
pos[i][cnt++] = j;//表示第i个字符在变换cnt次后所在的位置
j = p[j];
}
int t = m%cnt;//第i个字符变换的次数
str[pos[i][t]] = s[i];//将该字符存入其在目标串中的位置上
}
str[n] = '\0';
puts(str);
}
return ;
}

最新文章

  1. 解决VS+opencv中Debug版本与Release版本lib切换的问题
  2. java中的Comparable接口
  3. Eclipse 代码自动提示的设置
  4. Zend studio 10.6 配置XDEBUG
  5. OC Categroy类别
  6. Visual Studio C/C++ 编译器选项
  7. Rewrite的QSA是什么意思?
  8. 转载自php100中文网 centos下lamp 环境搭建
  9. c#--foreach遍历的用法与split的用法
  10. Swift3.0服务端开发(四) MySQL数据库的连接与操作
  11. Spark-RDD/DataFrame/DateSet
  12. IT学习网站
  13. qt中线程的使用方法
  14. Springboot-shiro-redis实现登录认证和权限管理
  15. 树状数组 || JZOI 1024. @szefany 的树
  16. 关于Linux系统下jdk版本切换问题(alternatives命令的使用)
  17. 51nod 1805 小树 (组合数模板,逆元公式)
  18. SQL中的字母的大小写转换
  19. Eclipse launch configuration----Eclipse运行外部工具
  20. ubuntu 14.4 apache2 django

热门文章

  1. Luogu P4549 裴蜀定理 / Min
  2. Flask保存或解压上传的文件
  3. 【转】Flex 布局
  4. Uva548 Tree
  5. 【网络流24题】最长k可重区间集问题(费用流)
  6. 食物链 2001年NOI全国竞赛
  7. Quartz原理解密
  8. 非常适合新手的jq/zepto源码分析02
  9. Linux: 查找使用中的port
  10. [miniApp] WeChat user login code