# 人物相关性分析 小明正在分析一本小说中的人物相关性。 他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说,小明定义 Alice 和 Bob “同时出现”的意思是:在小说文本中 Alice 和 Bob 之间不超过 K 个字符。 例如以下文本: ``` This is a story about Alice and Bob. Alice wants to send a private message to Bob. ``` 假设 K=20,则 Alice 和 Bob 同时出现了 2 次,分别是 Alice and Bob 和 Bob. Alice。 前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。 注意: * Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。 * Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能有字母。例如 Bobbi 並不算出现了 Bob。 **输入格式** 第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超过 1000000。 **输出格式** 输出一个整数,表示 Alice 和 Bob 同时出现的次数。 **数据范围** ``` 1≤K≤1000000 ``` **输入样例:** ``` 20 This is a story about Alice and Bob. Alice wants to send a private message to Bob. ``` **输出样例:** ``` 2 ``` 以下选项错误的是? ## aop ### before ```c #include using namespace std; ``` ### after ```c ``` ## 答案 ```c int main() { int k; scanf("%d", &k); getchar(); const char *a = "Alice", *b = "Bob"; char str[1000000]; gets(str); int length = strlen(str); int num = 0, i, j, t, flag; char word[20]; for (i = 0; i < length; i++) { if (str[i] == 'A' || str[i] == 'B') { j = 0; while (str[i] != ' ' && str[i] != '.') word[j++] = str[i++]; word[j] = '\0'; flag = 0; if (strcmp(word, a) == 0) flag = 1; else if (strcmp(word, b) == 0) flag = 2; if (flag == 1) { for (t = i; t < length; t++) { if (str[t] == 'B') { j = 0; while (str[t] != ' ' && str[t] != '.') word[j++] = str[t++]; word[j] = '\0'; if (strcmp(word, b) == 0) num++; } } } else if (flag == 2) { for (t = i; t < length; t++) { if (str[t] == 'A') { j = 0; while (str[t] != ' ' && str[t] != '.') word[j++] = str[t++]; word[j] = '\0'; if (strcmp(word, a) == 0) num++; } } } } } printf("%d\n", num); return 0; } ``` ## 选项 ### A ```c int cnt, k; bool temp = true; char f[2][20] = {"Alice", "Bob"}; bool check(string &a, int &pa, int &pb) { bool flage = true; pa = a.find(f[0], ++pa); if (pa == -1) temp = false; if (temp && abs((pa - 1) - pb) < k && pb) cnt++; if (a[pa - 1] != ' ' && a[pa + 6] != ' ') flage = false; pb = a.find(f[1], ++pb); if (pb == -1) temp = false; if (a[pb - 1] != ' ' && a[pb + 6] != ' ') flage = false; return flage; } int main() { string a; cin >> k; getchar(); getline(cin, a); int pa = 0, pb = 0; while (1) { if (check(a, pa, pb) && abs(pa - pb) < k && temp) { cnt++; } else if (!temp) break; } cout << cnt; return 0; } ``` ### B ```c #define mem(a, b) memset(a, b, sizeof a) #define PII pair #define ll long long #define ull unsigned long long #define IOS ios::sync_with_stdio(0), cin.tie(0) #define gcd(a, b) __gcd(a, b) #define ft first #define sd second #define endl '\n' #define PI acos(-1.0) #define lcm(a, b) a / gcd(a, b) * b #define INF_INT 0x3f3f3f3f #define INF_LONG 4557430888798830399 const int N = 4e6 + 9; int ta, tb; int a[N], b[N]; string s; int solve(string ss, int *cnt) { int t = 0, n = s.size(); for (int i = 0; i < n; i++) { if (s[i] == ss[0]) { if (i) { char ch = s[i - 1]; if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) continue; } int flag = 1, j; string tmp = ""; for (j = i; j < n && j - i < ss.size(); j++) { tmp += s[j]; } if (tmp != ss) flag = 0; if (j < n && ((s[j] >= 'a' && s[j] <= 'z') || (s[j] >= 'A' && s[j] <= 'Z'))) flag = 0; if (flag) cnt[t++] = i; } } return t; } int main() { int k; cin >> k; getchar(); getline(cin, s); int ta = solve("Alice", a); int tb = solve("Bob", b); ll ans = 0; for (int i = 0, lp = 0, rp = 0; i < ta; i++) { while (b[lp] < a[i] - 3 - k) lp++; while (b[rp] <= a[i] + k + 5 && rp < tb) rp++; if (rp - lp > 0) ans += (ll)(rp - lp); } cout << ans << endl; return 0; } ``` ### C ```c int len; string s; bool check(int i) { if (len - i < 5) return false; return s[i + 1] == 'l' && s[i + 2] == 'i' && s[i + 3] == 'c' && s[i + 4] == 'e'; } bool check2(int i) { if (len - i < 3) return false; return s[i + 1] == 'o' && s[i + 2] == 'b'; } int main() { int k; cin >> k; getchar(); getline(cin, s); len = s.length(); vector Alice, Bob; for (int i = 0; i < len; i++) { if (s[i] == 'A' && check(i)) { Alice.push_back(i); i += 5; } else if (s[i] == 'B' && check2(i)) { Bob.push_back(i); i += 3; } } int As = Alice.size(), Bs = Bob.size(); int i = 0, j = 0; long long ans = 0; for (int q = 0; q < As; q++) { while (i < Bs && Bob[i] < Alice[q] - k - 3) i++; while (j < Bs && Bob[j] <= Alice[q] + k + 5) j++; ans += j - i; } cout << ans << "\n"; return 0; } ```