标签:暴力枚举 tchar char 题目 bre 长度 div std 提示
做什么啊,我这么菜,应该弃赛的
[编程|1500分] 子串
第一行一个整数n(1 ≤ n ≤ 50,000)。 第二行一个字符串t(长度 ≤ 1,000,000)
"yes"表示存在满足条件的k,否则输出"no"
8 01112
yes
这个题很简单啊,这一场的手速题
暴力枚举KMP就好了,我想到了KMP但是没有从网上找模板,找到模板发现自己还是想的不好,最后优化成了这个样子,自我感觉还是很完美的
长度 ≤ 1,000,000,这个也是给我开数组的提示,竟然不坑,反正觉得2进制的1到50k还是不小的
#include <bits/stdc++.h> using namespace std; char s[1000005],t[1000005]; int nex[1000005]; int l; char f[20]; void la(int n, int b) { static char c[16]= {‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘}; l=0; while(n) { f[l++]=c[n%b]; n=n/b; } } void pre(char *p) { int i,n,k; n=strlen(p); nex[1]=nex[0]=0; k=0; for (i=2; i<=n; i++) { for(; k!=0&&p[k]!= p[i-1]; k=nex[k]); if(p[k]==p[i-1])k++; nex[i]=k; } } int kmp(char *text, char *p) { int m,n,s,q; m=strlen(p); n=strlen(text); q=s=0; while (s<n) { for (q=nex[q]; q<m&&p[q]==text[s]; q++,s++); if (q== 0) s++; else if(q==m) { return 1; } } return 0; } int main() { int n; scanf("%d",&n); getchar(); for(int i=0; ; i++) { char c=getchar(); if(c==‘\n‘) { t[i]=0; break; } t[i]=c; } pre(t); for(int j=16; j>1; j--) { int b=0; for(int i=1; i<=n; i++) { la(i,j); for(int k=l-1; k>=0; k--) s[b++]=f[k]; } s[b]=0; if(kmp(s,t)) return 0*puts("yes"); } return 0*puts("no"); }
标签:暴力枚举 tchar char 题目 bre 长度 div std 提示
原文地址:http://www.cnblogs.com/BobHuang/p/7077203.html