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

原文地址:https://www.cnblogs.com/SunQi-lvbu/p/7077429.html