https://code.google.com/codejam/contest/6224486/dashboard#s=p2

题目中的新运算满足传递性不满足自反性,满足传递性则可以先计算后面的部分再计算前面的,明显设每节的计算结果为val,则要成功必然需要val*val^(x-1)(也就是x个val相乘)恰为-1(i*j*k==-1),因为满足传递性,所以在此条件下,只需要取前面的一部分等于i,后面一部分等于k,中间一部分就会等于j了.

注意到无论每节的结果是什么,每四节的结果一定是1,所以左边的最小长度不会大于四节(否则会多一个1出来,没有用),同样,右边也不会大于四节,所以最小长度不会大于8节,直接把字符串缩小到8节以内展开即可也就是x%8

但是需要特殊注意的是,有两种情况

1. 原本大于8,x%8之后反而不满足题意了,这需要改成x%4+4

2. 在1的基础上,原本小于4,结果给改成大于4了,所以需要特判一下只有x>8的时候x=x%4+4

接下来直接展开计算即可

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <iostream>
  6. using namespace std;
  7. typedef long long ll;
  8. const int maxl=2.5e5+10;
  9. int l;
  10. ll x;
  11. char str[maxl];
  12. int val[maxl],rv[maxl];
  13.  
  14. int subcalc[255][255];
  15. void initcalc(){
  16. subcalc[1][1]=1;
  17. subcalc[1][(int)'i']=(int)'i';
  18. subcalc[1][(int)'j']=(int)'j';
  19. subcalc[1][(int)'k']=(int)'k';
  20. subcalc[(int)'i'][1]=(int)'i';
  21. subcalc[(int)'j'][1]=(int)'j';
  22. subcalc[(int)'k'][1]=(int)'k';
  23. subcalc[(int)'i'][(int)'j']=(int)'k';
  24. subcalc[(int)'j'][(int)'i']=-(int)'k';
  25. subcalc[(int)'i'][(int)'k']=-(int)'j';
  26. subcalc[(int)'k'][(int)'i']=(int)'j';
  27. subcalc[(int)'j'][(int)'k']=(int)'i';
  28. subcalc[(int)'k'][(int)'j']=-(int)'i';
  29. subcalc[(int)'i'][(int)'i']=-1;
  30. subcalc[(int)'j'][(int)'j']=-1;
  31. subcalc[(int)'k'][(int)'k']=-1;
  32. }
  33. int calc(int a,int b){
  34. int sign=a*b/abs(a)/abs(b);
  35. a=abs(a);
  36. b=abs(b);
  37. return sign*(subcalc[a][b]);
  38. }
  39. int indi,indk;
  40. void calvalue(){
  41. val[0]=(int)str[0];
  42. if(val[0]==(int)'i')indi=0;
  43. else indi=0x7ffffff;
  44. indk=-1;
  45. for(int i=1;i<l;i++){
  46. val[i]=calc(val[i-1],(int)str[i]);
  47. if(val[i]==(int)'i'){
  48. indi=min(indi,i);
  49. }
  50. }
  51. rv[l]=1;
  52. for(int i=l-1;i>=0;i--){
  53. rv[i]=calc((int)str[i],rv[i+1]);
  54. if(rv[i]==(int)'k'){
  55. indk=max(indk,i);
  56. }
  57. }
  58. }
  59.  
  60. int main(){
  61. freopen("data.in","r",stdin);
  62. freopen("data.out","w",stdout);
  63. initcalc();
  64. int T;
  65. cin>>T;
  66. for(int ti=1;ti<=T;ti++){
  67. cin>>l>>x>>str;
  68. //printf("%d %I64d %s\n",l,x,str);
  69. if(x>8){
  70. x=x%4+4;
  71. }
  72. for(int i=1;i<x;i++){
  73. for(int j=i*l;j<i*l+l;j++){
  74. str[j]=str[j-i*l];
  75. }
  76. }
  77. l*=x;
  78. str[l]=0;
  79. calvalue();
  80. int fl=val[l-1];
  81. if(fl!=-1||indi>=indk){
  82. cout<<"Case #"<<ti<<": NO"<<endl;
  83. }
  84. else {
  85. cout<<"Case #"<<ti<<": YES"<<endl;
  86. }
  87. }
  88. return 0;
  89. }

GCJ 2015-Qualification-C Dijkstra 特殊注意,展开 难度:2的更多相关文章

  1. [C++]Infinite House of Pancakes——Google Code Jam 2015 Qualification Round

    Problem It’s opening night at the opera, and your friend is the prima donna (the lead female singer) ...

  2. [C++]Standing Ovation——Google Code Jam 2015 Qualification Round

    Problem It’s opening night at the opera, and your friend is the prima donna (the lead female singer) ...

  3. VK Cup 2015 - Qualification Round 1 D. Closest Equals 离线+线段树

    题目链接: http://codeforces.com/problemset/problem/522/D D. Closest Equals time limit per test3 secondsm ...

  4. codeforces VK Cup 2015 - Qualification Round 1 B. Photo to Remember 水题

    B. Photo to Remember Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/522/ ...

  5. Codeforces VK Cup 2015 - Qualification Round 1 D. Closest Equals 离线线段树 求区间相同数的最小距离

    D. Closest Equals Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/prob ...

  6. VK Cup 2015 - Qualification Round 1 A. Reposts [ dp DAG上最长路 ]

    传送门 A. Reposts time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. POJ3463Sightseeing[次短路计数]

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8707   Accepted: 3056 Descr ...

  8. Windows开发环境搭建(安装 VS2010, VS2013, VS2015 Community, Windows Server 2008 R2)

    1. 安装VS2010 1.1 安装步骤 1. 注意安装的时候,选择自定义安装,将不需要的VB.net去掉. 2. 看一下C++下的x64选项是否选择了,如果没选,将其选上. 3. 一定要将 Micr ...

  9. Linux64位程序中的漏洞利用

    之前在栈溢出漏洞的利用和缓解中介绍了栈溢出漏洞和一些常见的漏洞缓解 技术的原理和绕过方法, 不过当时主要针对32位程序(ELF32). 秉承着能用就不改的态度, IPv4还依然是互联网的主导, 更何况 ...

随机推荐

  1. Tomcat的使用

    Tomcat的安装较为简单,尤其是Tomcat的安装文件apache-tomcat-7.0.19-windows-x86.zip,直接解压至目标目录下即可. Tomcat的安装目录下包括bin.con ...

  2. 【Oracle 数据迁移】环境oracle 11gR2,exp无法导出空表的表结构【转载】

    今天做数据迁移,但是发现有些空表无法exp,后来找到问题所在. [原文]:http://www.cnblogs.com/wenlong/p/3684230.html 11GR2中有个新特性,当表无数据 ...

  3. Oracle一个用户查询另一个用户的表数据

    1.两个用户是在不同的库,需要建立dblink 2.属于同一个库的不同用户 1)方法一:使用"用户名."的方式访问 例如:要从USER1账号访问USER2中的表TABLE2 A. ...

  4. Excel 、数据库 一言不合就转换 (zhuan)

    http://blog.csdn.net/marksinoberg/article/details/52280786 ***************************************** ...

  5. OpenGL的gluLookAt观察变换函数详解

    void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,                          GLdouble center ...

  6. Asp.NET设置Session过期时间的四种方式

    在Asp.net中,可以有四处设置Session的过期时间: 一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会话超时(分钟)-设置为120,即为2小时,即120分 ...

  7. Microsoft SQL Server

    instance / database / schema / object login / user / schema (dbo) sequence Collation PSM: Both Insta ...

  8. genymotion是一款完全超越BlueStacks

    今天给大家推荐一款超赞的神器:genymotion. 一:什么是genymotion      genymotion是一款完全超越BlueStacks的安卓模拟器,正如它中文官网的介绍:快到极致的An ...

  9. javaweb2 URL(查找的过程)

    URL: 全名叫统一资源定位符,用于定位互联网的资源. 问题:接上(javaweb1 tomcat)http://localhost:8080/myweb/test.html 分析:http://-- ...

  10. java 多线程8(守护线程)

    比如:后台偷偷运行的那些,qq下载更新包 如果一个进程中只剩下了守护线程,那么守护线程也会死亡.. 一个线程默认都不是守护线程. 判断是否是守护线程:例:d.isDaemon(); 当一个线程随着你的 ...