Dasha and Nightmares Dasha 和噩梦

time limit per test

4 seconds

memory limit per test

512 megabytes

Dasha, an excellent student, is studying at the best mathematical lyceum in the country. Recently, a mysterious stranger brought nn words consisting of small latin letters s1,s2,...,sns1,s2,...,sn to the lyceum. Since that day, Dasha has been tormented by nightmares.

Consider some pair of integers 〈i,j〉〈i,j〉 (1≤i≤j≤n1≤i≤j≤n). A nightmare is a string for which it is true:

  • It is obtained by concatenation sisjsisj;
  • Its length is odd;
  • The number of different letters in it is exactly 2525;
  • The number of occurrences of each letter that is in the word is odd.

For example, if si=si= "abcdefg" and sj=sj= "ijklmnopqrstuvwxyz", the pair 〈i,j〉〈i,j〉 creates a nightmare.

Dasha will stop having nightmares if she counts their number. There are too many nightmares, so Dasha needs your help. Count the number of different nightmares.

Nightmares are called different if the corresponding pairs 〈i,j〉〈i,j〉 are different. The pairs 〈i1,j1〉〈i1,j1〉 and 〈i2,j2〉〈i2,j2〉 are called different if i1≠i2i1≠i2 or j1≠j2j1≠j2.

Input

The first line contains a single integer nn (1≤n≤2⋅1051≤n≤2⋅105) --- the number of words.

The following nn lines contain the words s1,s2,...,sns1,s2,...,sn, consisting of small latin letters.

It is guaranteed that the total length of words does not exceed 5⋅1065⋅106.

Output

Print a single integer --- the number of different nightmares.

Example

Input

Copy

复制代码

10

ftl

abcdefghijklmnopqrstuvwxy

abcdeffghijkllmnopqrsttuvwxy

ffftl

aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyy

thedevid

bcdefghhiiiijklmnopqrsuwxyz

gorillasilverback

abcdefg

ijklmnopqrstuvwxyz

Output

Copy

复制代码
5

Note

In the first test, nightmares are created by pairs 〈1,3〉〈1,3〉, 〈2,5〉〈2,5〉, 〈3,4〉〈3,4〉, 〈6,7〉〈6,7〉, 〈9,10〉〈9,10〉.

每次测试时间限制 4 秒

每次测试内存限制 512 兆字节

Dasha 是一名优秀的学生,正在全国最好的数学学院学习。最近,一位神秘的陌生人将 n

个由小写拉丁字母 s1、s2、...、sn

组成的单词带到了学院。从那天起,Dasha 就一直被噩梦折磨。

考虑一对整数 〈i,j〉

(1≤i≤j≤n

)。噩梦是一个字符串,它为真:

它由连接 sisj 获得

它的长度是奇数;

其中不同字母的数量正好是 25

单词中每个字母出现的次数是奇数。

例如,如果 si=

"abcdefg" 和 sj=

"ijklmnopqrstuvwxyz",则对 〈i,j〉

会造成噩梦。

如果 Dasha 能数出噩梦的数量,她就不会再做噩梦了。噩梦太多了,所以 Dasha 需要你的帮助。数一数不同噩梦的数量。

如果对应的对 〈i,j〉

不同,则称噩梦不同。如果 i1≠i2

或 j1≠j2

,则对 〈i1,j1〉

和 〈i2,j2〉

不同。

输入

第一行包含一个整数 n

(1≤n≤2⋅105

) --- 单词数。

接下来的 n

行包含单词 s1,s2,...,sn

,由小写拉丁字母组成。

保证单词的总长度不超过 5⋅106

输出

打印一个整数------不同噩梦的数量。

示例

输入副本

10

ftl

abcdefghijklmnopqrstuvwxy

abcdeffghijkllmnopqrsttuvwxy

ffftl

aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyy

thedevid

bcdefghhiiiijklmnopqrsuwxyz

gorillasilverback

abcdefg

ijklmnopqrstuvwxyz

输出副本

5

注意

在第一个测试中,噩梦是由〈1,3〉

、〈2,5〉

、〈3,4〉

、〈6,7〉

、〈9,10〉

组成的。

代码:

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
using namespace std;

const long long MAX_N = 200010;
const long long FULL_MASK = (1 << 26) - 1;

unordered_map<long long, long long> count_map;

long long solve() {
    long long n;
    cin >> n;

    vector<string> strings(n + 1);
    vector<long long> bitmask(n + 1), all_chars(n + 1);

    for (long long i = 1; i <= n; ++i) {
        cin >> strings[i];
        for (char c : strings[i]) {
            bitmask[i] ^= (1 << (c - 'a'));
            all_chars[i] |= (1 << (c - 'a'));
        }
    }

    long long ans = 0;

    for (long long excluded_char = 0; excluded_char < 26; ++excluded_char) {
        count_map.clear();

        for (long long i = 1; i <= n; ++i) {
            if ((all_chars[i] >> excluded_char) & 1) continue;

            long long target = bitmask[i] ^ FULL_MASK ^ (1 << excluded_char);
            ans += count_map[target];
            count_map[bitmask[i]]++;
        }
    }

    return ans;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cout << solve() << endl;

    return 0;
}
相关推荐
乌萨奇也要立志学C++7 分钟前
【C++详解】STL-list模拟实现(深度剖析list迭代器,类模板未实例化取嵌套类型问题)
c++·list
闻缺陷则喜何志丹26 分钟前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找
序属秋秋秋2 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
十秒耿直拆包选手9 小时前
Qt:主窗体(QMainwindow)初始化注意事项
c++·qt
霖0011 小时前
C++学习笔记三
运维·开发语言·c++·笔记·学习·fpga开发
mit6.82411 小时前
[shad-PS4] Vulkan渲染器 | 着色器_重新编译器 | SPIR-V 格式
c++·游戏引擎·ps4
tan77º12 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip
Mike_Zhang13 小时前
C++使用WinHTTP访问http/https服务
c++
CHANG_THE_WORLD13 小时前
「macOS 系统字体收集器 (C++17 实现)」
开发语言·c++·macos
GiraKoo14 小时前
【GiraKoo】Breakpad 崩溃分析系统
c++