思路

被这道题坑了,看完题意秒写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;
}