美团CODEM 字串
来源:互联网 发布:java switch 例子 编辑:程序博客网 时间:2024/05/19 09:02
时间限制:1秒
空间限制:32768K
给出一个正整数n,我们把1..n在k进制下的表示连起来记为s(n,k),例如s(16,16)=123456789ABCDEF10, s(5,2)=11011100101。现在对于给定的n和字符串t,我们想知道是否存在一个k(2 ≤ k ≤ 16),使得t是s(n,k)的子串。
输入描述:
第一行一个整数n(1 ≤ n ≤ 50,000)。
第二行一个字符串t(长度 ≤ 1,000,000)
输出描述:
“yes”表示存在满足条件的k,否则输出”no”
输入例子:
8
01112
输出例子:
yes
解法:直接暴力拆分然后做一个KMP,但是要注意用下标为1的KMP在串是空串的时候要GG.所以选择下标为0的KMP的写法。
#include <bits/stdc++.h>using namespace std;const int maxn = 3000010;char s1[maxn], s2[maxn];string s;int fail[maxn];int n,len1,len2;int KMP(){ int i=0, j=0; while(i<len1){ if(j==-1||s1[i]==s2[j]){ i++; j++; } else{ j=fail[j]; } if(j==len2) return 1; } return 0;}int main(){ scanf("%d",&n); scanf("%s", s2); len2 = strlen(s2); int i=0, j=-1; fail[0]=-1; while(i<len2){ if(j==-1||s2[i]==s2[j]){ i++; j++; fail[i]=j; } else j=fail[j]; } int ans = 0; for(int jz = 2; jz<=16; jz++){ len1 = 0; for(int i=1; i<=n; i++){ int x = i, cnt = 0, num[100]; while(x){ num[cnt++] = x%jz; x/=jz; } for(int j=cnt-1; j>=0; j--){ if(num[j]<10){ s1[len1++]=num[j]+'0'; } else{ s1[len1++]=num[j]-10+'A'; } } } ans = max(ans, KMP()); if(ans > 0) break; } if(ans > 0) puts("yes"); else puts("no"); return 0;}
阅读全文
0 0
- 美团CODEM 字串
- 美团codeM比赛
- 美团CODEM 数码
- 美团codeM资格赛 优惠券
- 美团codeM资格赛 数码
- 美团codeM资格赛 锦标赛
- 美团CODEM 送外卖
- 美团CodeM 资格赛第一题
- CodeM美团点评编程大赛资格赛
- 美团Codem编程比赛资格赛:数码
- 美团CodeM编程大赛资格赛题解
- 美团codeM资格赛 音乐研究
- 美团codeM资格赛 送外卖
- 美团CODEM 数列互质 莫队
- 美团codeM预赛B 子串
- 美团codeM预赛B 黑白树
- 美团CodeM复赛 02,03
- 美团codeM预赛B 模
- Say Goodbye To findViewById
- oracle--left join and 和left join where的区别
- PHP 7中新的Hashtable实现和性能改进
- js使用rsa加密大数据块的java实现
- 使用mybatis在mysql中进行like查询遇到的问题
- 美团CODEM 字串
- java调用天气预报的webservice
- maven3.5+hadoop2.7.3统计米骑测试日志KPI指标(四)
- 创建爬虫----导航树
- git相关操作
- 进程——孤儿进程与僵尸进程
- Linux调整LVM容量
- hdu 3718 二分图最佳匹配 占坑待补
- 查询与增改删功能