codeM编程大赛E题 (暴力+字符串匹配(kmp))
题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10;
解题思路: n最大50000,k最大100000,以为暴力会超时。但确实可以暴力(wtf),直接将给的十进制数表示为K进制数。再暴力进行字符串比较即可(string的find函数??)或者使用KMP算法;
不确定A不AC的代码(其实是AC的):
#include<bits/stdc++.h> using namespace std; int f[ 2000000]; void getfill(string &s) { memset(f,0,sizeof(f)); for(int i=1;i<s.size();i++) { int j=f[i]; while(j && s[i]!=s[j]) j=f[j]; f[i+1]=(s[i]==s[j])?j+1:0; } } int findd(string &a,string &s) { int ans=0; int j=0; for(int i=0;i<a.size();i++) { while(j && a[i]!=s[j]) j=f[j]; if(a[i]==s[j]) j++; if(j==s.size()){ return 1; } } return 0; } string aa,bb; int main() {int n,t,k,i; cin>>n>>bb; getfill(bb); for(k=2;k<=16;k++) { aa=""; for(i=1;i<=n;i++) { string now=""; int tt=i; while(tt) { if(tt%k>=10) now+=(char)(tt%k-10+'A'); else now+=(char)(tt%k+'0'); tt/=k; } reverse(now.begin(),now.end()); aa+=now; } // cout<<aa<<endl; if(findd(aa,bb)>=1) { cout<<"yes"<<endl; return 0; } } cout<<"no"<<endl; return 0; }
PS:比较坑,不是很敢做,总感觉会超时!!!!!!!!!!!!!1