用C写的话要善用string.h中的函数
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct {char url[101]; int t;}Url; int cmp(const void *a, const void *b) { Url *p1=((Url*)a), *p2=((Url*)b); if(p1->t==p2->t) return strcmp(p1->url, p2->url); return p2->t-p1->t; } int main(void) { int T, I; scanf("%d",&T); for(I=0; I<T; I++) { int n, i, j; Url u[100], s[100]; scanf("%d",&n); for(i=0; i<n; i++) { char op[8]; scanf("%s",op); if(strcmp(op, "Visit")==0) { scanf("%s",u[i].url); u[i].t=1; for(j=0; j<i; j++) if(strcmp(u[i].url,u[j].url)==0) { u[j].t++; n--; i--; } } else { char ask[101]; scanf("%s",ask); int l, k, count=0; l=strlen(ask); for(k=0; k<i; k++) if(strncmp(u[k].url, ask, l)==0) s[count++]=u[k]; n--; i--; qsort(s, count, sizeof(s[0]), cmp); for(k=0; k<count; k++) printf("%s\n",s[k].url); printf("\n"); } } } return 0; }
struct linkData { string url; int cnt; }; bool cmp(const linkData &a, const linkData &b) { if (a.cnt == b.cnt) { return (a.url < b.url); } return (a.cnt > b.cnt); } void solve() { int n; cin >> n; cin.ignore(); map<string, int> linkCnt; for (int i = 0; i < n; i++) { string cmd, link; cin >> cmd >> link; cin.ignore(); if (cmd == "Visit") { if (linkCnt.find(link) == linkCnt.end()) { linkCnt[link] = 1; } else { linkCnt[link]++; } } else { vector<linkData> data; for (map<string, int>::iterator it = linkCnt.begin(); it != linkCnt.end(); it++) { if (it->first.find(link) != string::npos) { linkData tmp; tmp.url = it->first; tmp.cnt = it->second; data.push_back(tmp); } } sort(data.begin(), data.end(), cmp); for (vector<linkData>::iterator it = data.begin(); it != data.end(); it++) { cout << it->url << endl; } cout << endl; } } }
用C写的话要善用string.h中的函数