题解

129 条题解

  • -1
    @ 2018-10-07 10:18:20

    #include<iostream>
    #include<string>
    #include<cstdio>
    using namespace std;
    string s;
    int a[300][305]={0};
    int flag=1;
    int kk=0;

    int getNum(int x[],int m,int n){
    for(int i=n;i>=m;--i)
    x[n-i]=s[i]-'0';
    }
    void print(int x[]){
    int i;
    for(i=300;i>=0;i--)
    if(x[i]!=0) break;
    while(i>=0) cout<<x[i--];
    cout<<endl;
    }
    void print(int l){
    for(int i=1;i<=l;++i)
    cout<<s[i];
    cout<<endl;
    }
    void add(int x[],int t){
    x[0]+=t;
    int i=0;
    while(x[i]>=10)
    {
    x[i+1]+=x[i]/10;
    x[i]%=10;
    i++;
    }
    }
    void sub(int x[],int t){
    x[0]-=t;
    int i=0;
    while(x[i]<0)
    {
    x[i]+=10;
    x[i-1]-=1;
    i++;
    }
    }
    bool check(int i,int j,int m,int n){
    if(s[i]=='0'||s[m]=='0') return false;
    int x[305]={0},y[305]={0};
    getNum(x,i,j);
    getNum(y,m,n);
    add(x,1);
    for(int d=0;d<=300;d++)
    if(x[d]!=y[d]) return false;
    return true;
    }
    bool tailCheck(int i,int j,int m,int n){
    if(s[i]=='0'||s[m]=='0') return false;
    int x[305]={0},y[305]={0};
    getNum(x,i,j);
    getNum(y,m,n);
    add(x,1);
    int d1=300,d2=300;
    while(x[d1]==0) d1--;
    while(y[d2]==0) d2--;
    while(d1>=0&&d2>=0)
    {
    if(x[d1]!=y[d2]) return false;

    d1--;d2--;

    }
    return true;
    }

    //判断第一个数的位数是否能为l
    bool find(int l){
    int i,j,m,n;
    i=1;j=l;m=j+1;n=j+l;
    if(j==s.size()-1&&s[i]=='0') return false;
    while(true)
    {
    if(j>=s.size()-1) return true;
    if(n>=s.size()-1) {n=s.size()-1;if(!tailCheck(i,j,m,n)) return false;}
    else if(!check(i,j,m,n)) //前一个数和后一个数的位数都为l
    {
    if(!check(i,j,m,n+1)) //前一个数位数为l,后一个数位数为l+1

    return false;

    else {l+=1;n+=1;}

    }
    i=m;
    j=n;
    m=j+1;
    n=j+l;

    }

    return true;
    }

    void Multiply(int x[],int y){
    for(int i=0;i<=300;++i)
    x[i]*=y;

    for(int i=0;i<=300;++i)
    if(x[i]>9)
    {
    x[i+1]+=x[i]/10;
    x[i]%=10;
    }
    }
    void add(int x[],int y[]){
    for(int i=0;i<=300;++i)
    x[i]+=y[i];
    int i=0;
    while(x[i]>=10)
    {
    x[i+1]+=x[i]/10;
    x[i]%=10;
    i++;
    }
    }

    bool comp(int x[],int y[]){
    for(int i=300;i>=0;--i)
    if(x[i]<y[i]) return true;
    else if(x[i]>y[i]) return false;
    return false;
    }

    void getAns(int finalAns[],int l,int k){
    int x[305]={0},ans[305]={0};
    getNum(x,1,l);
    x[l-1]-=1;
    Multiply(x,l);
    for(int i=0;i<=300;++i)
    ans[i]=a[l-1][i]+x[i];
    ans[0]+=1+k+kk;
    for(int i=0;i<=300;++i)
    if(ans[i]>9)
    {
    ans[i+1]+=ans[i]/10;
    ans[i]%=10;
    }

    if(flag==1||comp(ans,finalAns))
    for(int i=0;i<=300;++i)
    finalAns[i]=ans[i];
    }
    //判断数组是否为1000....0000的形式
    bool Equal1000(int x[]){
    int tot=0;
    for(int i=0;i<=300;++i)
    if(x[i]!=0) tot++;
    if(tot>1) return false;
    return true;
    }

    //判断字符串是否为全0
    bool Equal000(string s1){
    for(int i=0;i<s1.size();++i)
    if(s1[i]!='0') return false;
    return true;
    }

    int main()
    {
    //a[i]表示所有位数<=i的字符串长度和
    for(int i=1;i<=200;++i)
    {
    a[i][i-1]=9;
    Multiply(a[i],i);
    add(a[i],a[i-1]);
    }

    int finalAns[305]={0};
    flag=1;

    string s1;
    cin>>s1;

    //如果字符串=000...0,则在最前面加上0,令kk=1,最后的答案要减去kk
    if(Equal000(s1))
    {s1="1"+s1;kk=1;}

    //l为字符串中第一个数的位数
    //k表示字符串中第一个字符是第一个数的第K+1位,k<l
    for(int l=1;l<=s1.size();++l)
    for(int k=0;k<l;++k)
    {
    s=" "+s1;string s2="";
    if(k==0)
    {
    if(find(l))
    {getAns(finalAns,l,k);flag=0;}
    }

    //如果K!=0,则补齐第一个数的前k位
    if(k!=0)
    {

    int x[305]={0};
    getNum(x,l-k+1,l-k+k);

    //1.直接把第l-k+1至l-k+k之间的数补齐第一个数的前k位

    s2="";
    int i=k-1;
    while(i>=0) s2+=x[i--]+'0';
    s=" "+s2+s1;
    if(find(l))
    {getAns(finalAns,l,k);flag=0;}

    //2.如果第l-k+1至l-k+k之间数的形式是10....000,也可以用99....999补齐第一个数的前k位

    if(Equal1000(x))
    {
    s2="";
    i=k-1;
    while(i>=0) {s2+='9';i--;}
    s=" "+s2+s1;
    if(find(l))
    {getAns(finalAns,l,k);flag=0;}
    }
    //3.用第l-k+1至l-k+k之间的数减去1,补齐第一个数的前k位

    sub(x,1);
    i=k-1;
    s2="";
    while(i>=0) s2+=x[i--]+'0';
    s=" "+s2+s1;
    if(find(l))
    {getAns(finalAns,l,k);flag=0;}

    }

    }

    print(finalAns);

    // system("pause");

    }

  • -1
    @ 2015-03-01 13:18:17

    #include "string"
    #include "iostream"
    #include "math.h"

    using namespace std;

    string ToASCII(int Num) {
    string Result;
    int DigitsNum;
    for (int i = 0;; i++) {
    if (pow(10, i) > Num) {
    DigitsNum = i;
    break;
    }
    }
    for (int Number; DigitsNum >= 1; DigitsNum--) {
    Number = int(Num / (int)pow(10, (DigitsNum - 1)) % 10);
    Result += Number + 48;
    }
    return Result;
    }

    int main() {
    string Num_A, Num_S;
    int IndexOf;
    cin >> Num_A;
    for (int i = 1;; i++) {
    Num_S += ToASCII(i);
    if ((IndexOf = Num_S.find(Num_A)) != -1) {
    break;
    }
    }
    cout << IndexOf + 1;
    }

  • -1
    @ 2007-08-05 20:17:55

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ├ 测试数据 11:答案正确... 0ms

    ├ 测试数据 12:答案正确... 0ms

    ├ 测试数据 13:答案正确... 0ms

    ├ 测试数据 14:答案正确... 0ms

    ├ 测试数据 15:答案正确... 0ms

    ├ 测试数据 16:答案正确... 0ms

    ├ 测试数据 17:答案正确... 0ms

    ├ 测试数据 18:答案正确... 0ms

    ├ 测试数据 19:答案正确... 0ms

    ├ 测试数据 20:答案正确... 0ms

    ├ 测试数据 21:答案正确... 0ms

    ├ 测试数据 22:答案正确... 0ms

    ├ 测试数据 23:答案正确... 0ms

    ├ 测试数据 24:答案正确... 0ms

    ├ 测试数据 25:答案正确... 0ms

    ├ 测试数据 26:答案正确... 0ms

    ├ 测试数据 27:答案正确... 0ms

    ├ 测试数据 28:答案正确... 0ms

    ├ 测试数据 29:答案正确... 25ms

    ├ 测试数据 30:答案正确... 0ms

    ├ 测试数据 31:答案正确... 0ms

    ├ 测试数据 32:答案正确... 0ms

    ├ 测试数据 33:答案正确... 0ms

    ├ 测试数据 34:答案正确... 0ms

    ├ 测试数据 35:答案正确... 0ms

    ├ 测试数据 36:答案正确... 0ms

    ├ 测试数据 37:答案正确... 0ms

    ├ 测试数据 38:答案正确... 0ms

    ├ 测试数据 39:答案正确... 0ms

    ├ 测试数据 40:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:25ms

    太高兴了,第二遍AC了

    穷举长度和开始点

    一个5K的,196行的巨繁无比程序...

  • -1
    @ 2007-08-02 20:20:47

    这道题太牛了吧。。。。

  • -1
    @ 2007-07-22 16:07:57

    不在这里留下点什么真是对不起我做这题……

    枚举在那里断开哈

    266行 呜呜

  • -1
    @ 2007-07-05 20:41:16

    枚举,谢谢

  • -1
    @ 2007-05-27 19:20:02

    建议大家去ural交一遍。。

    这里数据不是原创的。

  • -1
    @ 2007-05-12 01:46:39

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ├ 测试数据 11:答案正确... 0ms

    ├ 测试数据 12:答案正确... 0ms

    ├ 测试数据 13:答案正确... 0ms

    ├ 测试数据 14:答案正确... 0ms

    ├ 测试数据 15:答案正确... 0ms

    ├ 测试数据 16:答案正确... 0ms

    ├ 测试数据 17:答案正确... 0ms

    ├ 测试数据 18:答案正确... 0ms

    ├ 测试数据 19:答案正确... 0ms

    ├ 测试数据 20:答案正确... 0ms

    ├ 测试数据 21:答案正确... 0ms

    ├ 测试数据 22:答案正确... 0ms

    ├ 测试数据 23:答案正确... 0ms

    ├ 测试数据 24:答案正确... 0ms

    ├ 测试数据 25:答案正确... 0ms

    ├ 测试数据 26:答案正确... 0ms

    ├ 测试数据 27:答案正确... 0ms

    ├ 测试数据 28:答案正确... 0ms

    ├ 测试数据 29:答案正确... 0ms

    ├ 测试数据 30:答案正确... 0ms

    ├ 测试数据 31:答案正确... 0ms

    ├ 测试数据 32:答案正确... 0ms

    ├ 测试数据 33:答案正确... 0ms

    ├ 测试数据 34:答案正确... 0ms

    ├ 测试数据 35:答案正确... 0ms

    ├ 测试数据 36:答案正确... 0ms

    ├ 测试数据 37:答案正确... 0ms

    ├ 测试数据 38:答案正确... 0ms

    ├ 测试数据 39:答案正确... 0ms

    ├ 测试数据 40:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • -4
    @ 2016-08-20 14:18:21

    Accepted, time = 75 ms, mem = 564 KiB, score = 400

    博客园:详细题解+有些许注释的代码
    CSDN:详细题解+有些许注释的代码

信息

ID
1005
难度
8
分类
字符串 | KMP 点击显示
标签
(无)
递交数
6615
已通过
624
通过率
9%
被复制
30
上传者