• 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

  • 相关阅读:
    双显示器或更多个显示器,能分别设置不同的壁纸吗?
    二叉排序树
    如何将一棵树转化为对应的二叉树
    【例2.1】使用成员函数的实例
    [例1.10]使用setw设置输出宽度的例子
    python学习(三)-面向对象
    git 笔记
    python学习笔记(二)
    python基础语法
    fiddler
  • 原文地址:https://www.cnblogs.com/SunQi-lvbu/p/7077429.html
Copyright © 2020-2023  润新知