#include
#include
#include
#include
#include
#include
using namespace std;
struct Info {
string name;
int cnt;
};
vector vec;
map mp;
bool check(string s) {
if (s.size() == 0)
return false;
int len = s.size();
if (s[0] 'Z')
return false;
for (int i = 1; i
if (s[i] 'z')
return false;
++mp[s];
return true;
}
bool split(string s) {
int len = s.size();
if (len == 0)
return false;
string cur;
int p = 0;
while (p
if (s[p] == ',') {
bool ok = check(cur);
if (!ok)
return false;
cur = "";
} else {
cur += s[p];
}
++p;
}
if (cur.size() > 0) {
bool ok = check(cur);
if (!ok)
return false;
}
return true;
}
bool cmp(const Info &a, const Info &b) {
if (a.cnt != b.cnt)
return a.cnt
if (a.name.size() == b.name.size())
return a.name > b.name;
if (a.name.find(b.name) != string::npos) {
return true;
}
if (b.name.find(a.name) != string::npos)
return false;
return a.name > b.name;
}
int main()
{
string input;
cin >> input;
bool valid = split(input);
if (!valid) {
cout <
} else {
for (auto o : mp) {
vec.push_back({o.first, o.second});
}
sort(vec.begin(), vec.end(), cmp);
cout <
}
return 0;
} 第二题
#include
#include
#include
#include
using namespace std;
struct Info {
string addr;
string mask;
string val;
};
vector vec;
string pattern, content;
bool check16(string s) {
int len = s.size();
if (len
return false;
int idx = 0;
if (s[idx] != '0')
return false;
++idx;
if (s[idx] != 'x' && s[idx] != 'X')
return false;
++idx;
string num = s.substr(idx);
for (int i = 0; i
char ch = num[i];
if (ch >= '0' && ch <= '9')
continue;
if (ch >= 'A' && ch <= 'F')
continue;
if (ch >= 'a' && ch <= 'f')
continue;
return false;
}
return true;
}
void check(string s) {
int len = s.size();
string head = s.substr(0, pattern.size());
if (head != pattern)
return;
int idx = pattern.size();
if (idx
return;
++idx;
if (s.substr(idx, 5) != "addr=")
return;
idx += 5;
int comma = s.find(",", idx);
if (comma == string::npos || !check16(s.substr(idx, comma - idx)))
return;
string addr = s.substr(idx, comma - idx);
// cout <
idx = comma + 1;
if (s.substr(idx, 5) != "mask=")
return;
idx += 5;
// cout <
comma = s.find(",", idx);
// cout <
if (comma == string::npos || !check16(s.substr(idx, comma - idx)))
return;
string mask = s.substr(idx, comma - idx);
// cout <
idx = comma + 1;
if (s.substr(idx, 4) != "val=")
return;
idx += 4;
if (!check16(s.substr(idx)))
return;
string val = s.substr(idx);
// cout <
vec.push_back({addr, mask, val});
}
void solve(string s) {
int len = s.size();
int idx = 0;
while (idx
int r = s.find("],", idx);
if (r == string::npos)
break;
check(s.substr(idx, r - idx));
idx = r + 2;
}
while (idx
int r = s.find("]", idx);
// cout <
if (r == string::npos)
break;
check(s.substr(idx, r - idx));
idx = r + 1;
}
}
int main()
{
cin >> pattern >> content;
solve(content);
if (vec.size() == 0)
cout <
else {
for (int i = 0; i
cout <
}
return 0;
} 第三题