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

接下来直接展开计算即可

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const int maxl=2.5e5+10;
int l;
ll x;
char str[maxl];
int val[maxl],rv[maxl]; int subcalc[255][255];
void initcalc(){
subcalc[1][1]=1;
subcalc[1][(int)'i']=(int)'i';
subcalc[1][(int)'j']=(int)'j';
subcalc[1][(int)'k']=(int)'k';
subcalc[(int)'i'][1]=(int)'i';
subcalc[(int)'j'][1]=(int)'j';
subcalc[(int)'k'][1]=(int)'k';
subcalc[(int)'i'][(int)'j']=(int)'k';
subcalc[(int)'j'][(int)'i']=-(int)'k';
subcalc[(int)'i'][(int)'k']=-(int)'j';
subcalc[(int)'k'][(int)'i']=(int)'j';
subcalc[(int)'j'][(int)'k']=(int)'i';
subcalc[(int)'k'][(int)'j']=-(int)'i';
subcalc[(int)'i'][(int)'i']=-1;
subcalc[(int)'j'][(int)'j']=-1;
subcalc[(int)'k'][(int)'k']=-1;
}
int calc(int a,int b){
int sign=a*b/abs(a)/abs(b);
a=abs(a);
b=abs(b);
return sign*(subcalc[a][b]);
}
int indi,indk;
void calvalue(){
val[0]=(int)str[0];
if(val[0]==(int)'i')indi=0;
else indi=0x7ffffff;
indk=-1;
for(int i=1;i<l;i++){
val[i]=calc(val[i-1],(int)str[i]);
if(val[i]==(int)'i'){
indi=min(indi,i);
}
}
rv[l]=1;
for(int i=l-1;i>=0;i--){
rv[i]=calc((int)str[i],rv[i+1]);
if(rv[i]==(int)'k'){
indk=max(indk,i);
}
}
} int main(){
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
initcalc();
int T;
cin>>T;
for(int ti=1;ti<=T;ti++){
cin>>l>>x>>str;
//printf("%d %I64d %s\n",l,x,str);
if(x>8){
x=x%4+4;
}
for(int i=1;i<x;i++){
for(int j=i*l;j<i*l+l;j++){
str[j]=str[j-i*l];
}
}
l*=x;
str[l]=0;
calvalue();
int fl=val[l-1];
if(fl!=-1||indi>=indk){
cout<<"Case #"<<ti<<": NO"<<endl;
}
else {
cout<<"Case #"<<ti<<": YES"<<endl;
}
}
return 0;
}

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. JavaWeb学习总结(八)—Cookie

    1.什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器. ...

  2. Matlab中的persistent变量

    persistent, 用于定义persistent变量.persistent变量对于声明它的函数来说是局部的,但是当退出该函数时,该变量仍然保存在内存中,数值并不变.persistent变量与全局变 ...

  3. epoll函数与参数总结学习 & errno的线程安全

    select/poll被监视的文件描述符数目非常大时要O(n)效率很低:epoll与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以 ...

  4. Android 监听键盘的弹起与收缩

    Android 监听键盘的弹起与收缩 由于android不存在该监听的API 所以需要自己去处理 先上代码 /* android:windowSoftInputMode="stateAlwa ...

  5. WebKit渲染基础(转载 学习中。。。)

    概述 WebKit是一个渲染引擎,而不是一个浏览器,它专注于网页内容展示,其中渲染是其中核心的部分之一.本章着重于对渲染部分的基础进行一定程度的了解和认识,主要理解基于DOM树来介绍Render树和R ...

  6. Maven——eclipse中使用Maven创建Web项目

    原文:http://www.cnblogs.com/xdp-gacl/p/4054814.html 一.创建Web项目 1.1 选择建立Maven Project 选择File -> New - ...

  7. haskell读写文件相关(含二进制)

    使用System.IO模块 使用函数 openBinaryFile :: FilePath -> IOMode -> IO Handle 打开文件 IOMode为 ReadWriteMod ...

  8. phalcon: router规则与解析,已经生成router的链接地址

    本人采用的是假分模块(目录),通过命名空间来进行模块分组的,非官方分组,所以在router是都会加上 namespace 信息,你也可适当的参考: 前提: /** * 注册命名空间 */ $loade ...

  9. JVM调优总结(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  10. var isObj = length === undefined || i

    这个其实是因为你前面那个===是肯定为false导致的,所以执行到了i那一步了var length=undefined;var a=length===undefined || i;这样你不定义i也是不 ...