题解 | #子串#

子串

https://ac.nowcoder.com/acm/problem/13253

思路

被这道题坑了,看完题意秒写Kmp,交了之后只过了90%,各种改最后才发现没有考虑ABCDEF的情况。(啊太粗心了)
做法:第一层循环是进制数k,递归或者循环+reverse得出字符串s,然后如果kmp得t是s的子串,则直接输出yes结束程序,如果k到16还是没有退出,那么输出no。怕麻烦不想写kmp也可以用s.find(t)!=0。

代码

#include<bits/stdc++.h>
using namespace std;

int n,kmp[1000005];
string t,s;

string work(int x,int y){
    string str="";
    while(x){
        if(x%y>=10) str+=x%y+'A'-10;
        else str+=x%y+'0';
        x/=y;
    }
    reverse(str.begin(),str.end());
    return str;
}

void kmp_pre(string str){
    int j=0;
    kmp[0]=0;
    for(int i=1;i<str.length();i++){
        j=kmp[i];
        while(j&&str[j]!=str[i]) j=kmp[j];
        if(str[i]==str[j]) kmp[i+1]=j+1;
        else kmp[i+1]=0;
    }
}


int main(){
    scanf("%d",&n);
    cin>>t;
    kmp_pre(t);
    //for(int i=0;i<=t.length();i++) cout<<kmp[i]<<" ";
    for(int k=2;k<=16;k++){
        s="";
        for(int i=1;i<=n;i++) s+=work(i,k);
        int j=0;
        for(int i=0;i<s.length();i++){
            while(j&&s[i]!=t[j]) j=kmp[j];
            if(s[i]==t[j]){
                j++;
                if(j==t.length()){
                    cout<<"yes"<<endl;
                    return 0;
                }
            }
        }
    }
    cout<<"no"<<endl;
    return 0;
}
全部评论

相关推荐

02-19 13:42
门头沟学院 Java
运气爆棚福星高赵:清✌️不用很在意项目,八股算法是重点,八股算法说的过去绝对要您
点赞 评论 收藏
分享
昨天 12:10
已编辑
牛客_产品运营部_运营
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务