首页 > 代码库 > [字符串]联系 Contact

[字符串]联系 Contact

题目链接

思考

20W的字符串长度,我们可以先用for循环模拟出来,这个字符串所包含的 所有A,A+1,A+2...B-1,B长度的字符串,

之后按照规则排序,输出。

整体难度在于排序的实现和坑爹的输出。

 

吐槽:这个奇葩的读入方式我始终没搞懂。 while(cin>>f) s+=f就AC  cin>>s输出就WA。

 

技术分享
#include <cstdio>#include <map>#include <algorithm>#include <iostream>#include <cstring>#include <string>using namespace std;struct node{    string a;    int Num;    bool operator < (const node &fuck)const{        if(Num==fuck.Num){            if(a.length() == fuck.a.length() ) return a < fuck.a;            else return a.length() < fuck.a.length();        }        return Num > fuck.Num;    }}Str[200010];int cnt,ans,tot,x,y,n;string f,s;map<string,bool>exi;map<string,int>num;int main(){    scanf("%d%d%d",&x,&y,&n);    while(cin>>f) s+=f;    for(register int i=0;i<=s.length()-1;i++){        for(register int j=x;j<=y;j++){            if(i+j > s.length()) continue;            string ss = s.substr(i,j);            //cout<<ss<<endl;            if(!exi[ss]){                 exi[ss]=1;                num[ss]++;                Str[++cnt].a=ss;            }            else num[ss]++;        }    }    for(int i=1;i<=cnt;i++) Str[i].Num = num[Str[i].a];    sort(Str+1,Str+1+cnt);    for(int i=1;i<=cnt;i++){        printf("%d\n",Str[i].Num);        ans = 0;        while(Str[i].Num==Str[i+1].Num){            cout<<Str[i].a;            ans++;            if(ans%6==0) printf("\n");            else printf(" ");            i++;        }        cout<<Str[i].a<<endl;        if(++tot==n) break;    }    return 0;}
代码实现

 

[字符串]联系 Contact