【NOIP模拟题】【暴力求解法】【JOI】2016.11.14第二题 愉快的logo设计 题解
来源:互联网 发布:python smtp.sendmail 编辑:程序博客网 时间:2024/05/10 00:50
愉快的logo设计(B.c/cpp/pas/in/out)
(Time Limit:1s Memory Limit:256MB)
【Description】
K理事长正在思考日本信息学奥林匹克竞赛选手的应援道具的logo问题。某天,K理事长突发奇想,想要设计一个用’J’,’O’,’I’三种文字环形排列的logo,意为希望选手能从JOI中收获快乐的意思。
(注:“环形地”在日文中的表述为“円状に”,“円”读作“en”,再加上“JOI”三个字即为“enjoy”„„)
如下所示,对于任意非负整数k,我们定义标号为k的JOI序列Sk为:
·S0为’J’,’O’,’I’中任一字符构成的长度为1的字符串
·S[k+1]为最初4^k个字符都是’J’,接下来的4^k个字符都是’O’,接下来的4^k个字符都是’I’,最后4^k个字符是字符串Sk的长为4^(k+1)的字符串
现在,K理事长在纸上写下了由4^K个文字构成的一个环形字符串,字符串中每个字符都是’J’,’O’,’I’中的一个。K理事长想要修改一些文字,使得得到的字符串从某个起点开始顺时针读一圈后可以得到SK。在满足条件的情况下,要求修改的文字数量最少。
【Input】
第一行一个正整数K,表示K理事长在纸上写下了一个长度为4^K的环状字符串。
第二行一个由’J’,’O’,’I’三个字符构成的长为4^K的字符串,表示纸上的环形字符串从某个起点出发顺时针阅读一圈得到的字符串。
【Output】
输出一行一个整数,表示修改文字数量的最小值。
【Sample Input】
2
JJOIJJOJOIOJOOOI
【Sample Output】
7
【HINT】
从○标记的位置顺时针阅读一圈得到“JJJJOOOOIIIIJOIJ”,满足S2的条件,且修改文字数达到最小值7。
【Data Constraint】
对于30%的数据,1<=K<=5
对于100%的数据,1<=K<=10
我们的所求的那个字符串是几乎确定的,那么我们就改变开头来暴力搞他。(30%)
记录J、O、I的前缀和,再暴力。(100%)
附代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<queue>#include<stack>#include<map>#include<set>#include<string>#include<iomanip>#include<ctime>#include<climits>#include<cctype>#include<algorithm>#define LL long long#ifdef WIN32#define AUTO "%I64d"#else#define AUTO "%lld"#endifusing namespace std; const int maxxx = 1048580;int k,len,tot=1e9+7;int J[maxxx*2],O[maxxx*2],I[maxxx*2],f[12];char a[maxxx*2];template <class T> inline void read(T &xx){ xx = 0; T flag = 1; char ch = (char)getchar(); while(ch<'0' || ch>'9') { if(ch == '-') flag = -1; ch = (char)getchar(); } while(ch>='0' && ch<='9') { xx = (xx<<1) + (xx<<3) + ch - '0'; ch = (char)getchar(); } xx *= flag;}void init(){ read(k); scanf("%s",a); len = strlen(a); for (int i = len; i <= len*2-1; i++) a[i] = a[i-len]; len = strlen(a);}void work(){ f[0] = 1; for(int i = 1; i <= 10; i++) f[i] = f[i-1] * 4; for(int i = 0; i < len; i++) { J[i] += J[i-1]; O[i] += O[i-1]; I[i] += i[I-1]; if(a[i] == 'J') J[i]++; if(a[i] == 'O') O[i]++; if(a[i] == 'I') I[i]++; } for(int i=0;i<len/2;i++) { int ans = 1, h = i; for(int j = k - 1; j >= 0; j--) { for(int s = 0; s <= 2; s++) { if(h != 0) { if(s == 0) ans += J[h+f[j]-1] - J[h-1]; if(s == 1) ans += O[h+f[j]-1] - O[h-1]; if(s == 2) ans += I[h+f[j]-1] - I[h-1]; h += f[j]; } else { if(s == 0) ans += J[h+f[j]-1]; if(s == 1) ans += O[h+f[j]-1]; if(s == 2) ans += I[h+f[j]-1]; h += f[j]; } } } tot = min(tot, len/2-ans); }}int main(){ freopen("B.in","r",stdin); freopen("B.out","w",stdout); init(); work(); printf("%d",tot); return 0;}
- 【NOIP模拟题】【暴力求解法】【JOI】2016.11.14第二题 愉快的logo设计 题解
- 【NOIP模拟】愉快的logo设计
- 【NOIP模拟题】【暴力求解法】2016.11.17 第一题 素数密度 题解
- 【NOIP模拟题】【模拟】【DP】【JOI】2016.11.14第一题 复制&粘贴2 题解
- 【NOIP模拟题】【DP】【同余最短路】【暴力剪枝】2016.11.15 第二题 小L的牛栏 题解
- 愉快的logo设计
- 愉快的logo设计
- 【NOIP模拟题】【DP】2016.11.10 第二题题解
- 【NOIP模拟题】【图论】2016.11.18 第二题 心 题解
- JZOJ 4295【NOIP2015模拟11.2】愉快的logo设计
- NOIP模拟题题解
- 【NOIP模拟题】【动态规划DP】2016.11.11第二题Landscaping题解
- 【NOIP模拟题】【贪心】【动态规划DP】2016.11.12第二题题解
- ssoj2454愉快的logo设计(dp)
- NOIP模拟题 [构造][贪心][暴力]
- NOIP模拟题[数论}[暴力][拆点]
- 第七章:暴力求解法。第二部分
- 【NOIP模拟题】【数学归纳法】2016.11.10第一题题解
- Java - 趣味题(5) --- Windows 下制图
- PHP获取ip与ip所在城市
- PHP递归算法的简单实例
- Ubuntu下两个gcc版本切换
- 关于Spring框架的Ioc&DI的相关知识
- 【NOIP模拟题】【暴力求解法】【JOI】2016.11.14第二题 愉快的logo设计 题解
- 使用C11的原子操作来实现线性单链表操作
- 个人主页及博客源码
- pyspark map,reduce接收参数
- 是返回错误码,还是抛出异常?说说我的选择
- 解决IllegalStateException: AwContentsClientCallbackHelper: unhandled message 1000
- Spark中文手册9:spark GraphX编程指南(2)
- 【HNOI 2004】 敲砖块 解题报告
- linux导出mysql 某表语句数据