UVa11127 - Triple-Free Binary Strings
2014-02-23 10:20
876 查看
Problem J
Triple-Free Binary Strings
Input: Standard Input
Output: Standard Output
Triple-Free Binary Strings
Input: Standard Input
Output: Standard Output
A binary string consists of ones and zeros. Given a binary string T, if there is no binary string S such that SSS (concatenate three copies of S together) is a substring of T, we say T is triple-free.
A pattern consists of ones, zeros and asterisks, where an asterisk(*) can be replaced by either one or zero. For example, the pattern 0**1 contains strings 0001, 0011, 0101, 0111, but not 1001 or 0000.
Given a pattern P, how many triple-free binary strings does it contain?
Input Each line of the input represents a test case, which contains the length of pattern, n(0<n<31), and the pattern P. There can be maximum 35 test cases.
The input terminates when n=0.
Output For each test case, print the case number and the answer, shown below.
Sample Input Output for Sample Input
4 0**1 5 ***** 10 **01**01** 0 | Case 1: 2 Case 2: 16 Case 3: 9 |
import java.io.IOException; import java.io.FileReader; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; import java.util.TreeSet; class Main { public static final boolean DEBUG = false; public static final int N = 40; public static char[] buf = new char ; public static char[] b = new char ; public static TreeSet<Integer> ts = new TreeSet<Integer>(); public static int ans, n; public static void dfs(int cur) { if (cur >= 3) { int t = cur / 3 * 3; for (int i = 3; i <= t; i += 3) { int temp = 0; for (int j = cur - i; j < cur; j++) { temp <<= 1; temp |= b[j] - '0'; } if (ts.contains(temp)) return; } } if (cur == n) { ans++; return; } if (buf[cur] != '*') { b[cur] = buf[cur]; dfs(cur + 1); } else { b[cur] = '0'; dfs(cur + 1); b[cur] = '1'; dfs(cur + 1); } } public static void main(String[] args) throws IOException { Scanner cin; String s; int t = 1; if (DEBUG) { cin = new Scanner(new FileReader("d:\\OJ\\uva_in.txt")); } else { cin = new Scanner(new InputStreamReader(System.in)); } for (int i = 1; i <= 10; i++) { for (int j = 0; j < (1 << i); j++) { ts.add(j | (j << i) | (j << (2 * i))); } } while (cin.hasNext()) { n = cin.nextInt(); if (n == 0) break; s = cin.next(); buf = s.toCharArray(); ans = 0; dfs(0); System.out.println("Case " + (t++) + ": " + ans); } } }
相关文章推荐
- poj 2677 Tour(双调欧几里德旅行商问题,dp)
- Unity3D游戏制作(三)——移动平台上的角色阴影制作
- EASY_PAT_ADVANCED LEVEL 1008_简单的面向对象 队列的使用
- 连接的价值——汇聚信息
- 图说微积分(六)泰勒级数
- 《高效学习OpenGL》 之 显示列表实例 glCallList(),glGenLists(),glNewList(),glEndList()
- visio2010去除直线交叉处的跨线
- 关于【分页显示】的一些方法
- 为一个不爱的人难过太不值了
- 将Android和iOS设备屏幕映射到电脑屏幕工具
- 4年之后我们又相见了
- 有时,爱也是种伤害.残忍的人,选择伤害别人,善良的人,选择伤害自己.
- 黑马程序员---UDP传输
- dblink传输clob字段三种解决方案
- UVa 11729 Commando War 贪心
- 傲游发布“马上看”版本 独家震撼推出视频快进功能(亲测,可快进视频前的广告哦)
- 不被人厌恶的伸手党
- 昨天我干了什么
- 算法提高 道路和航路
- led驱动编写