zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    leetcode-38.报数
    leetcode-35.搜索插入位置
    leetcode-27.移除元素
    leetcode-26.删除重复数组中的重复项
    leetcode-20.有效的括号
    leetcode-973最接近原点的K个点
    leetcode-14最长公共前缀
    leetcode-13罗马字符转整数
    MFC俄罗斯方块
    leetcode-9.回文数(水仙花数)
  • 原文地址:https://www.cnblogs.com/SunQi-lvbu/p/7077429.html
Copyright © 2011-2022 走看看