1. 程式人生 > >[字符串]聯系 Contact

[字符串]聯系 Contact

std 模擬 mes 題目 ace end 字符串 ble ring

題目鏈接

思考

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