题意:~
思路:
#include <bits/stdc++.h>
using namespace std;
const int N = 400050;
struct Trie {
int next[N][26];
int root, L;
int num[26];
int newnode()
{
for(int i = 0;i < 26; ++i)
next[L][i] = -1;
L++;
return L - 1;
}
void init()
{
L = 0;
root = newnode();
fill(num, num + 26, 0);
}
void insert(string buf)
{
int now = root;
bool f = false;
for(auto &i : buf)
{
if(next[now][i - 'a'] == -1)
{
next[now][i - 'a'] = newnode();
if(f) num[i - 'a']++;
}
now = next[now][i - 'a']; f = true;
}
}
};
Trie ac, wa;
bool vis[26];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
while(cin >> n)
{
ac.init();
wa.init();
string str;
fill(vis, vis + 26, false);
long long ans = 0;
for(int i = 0; i < n; ++i)
{
cin >> str;
if(str.size() == 1)
{
if(!vis[str[0] - 'a'])
{
vis[str[0] - 'a'] = 1;
ans++;
}
}
ac.insert(str);
reverse(str.begin(), str.end());
wa.insert(str);
}
ans += (long long)(ac.L - 1) * (wa.L - 1);
for(int i = 0; i < 26; ++i)
ans -= (long long)ac.num[i] * wa.num[i];
cout << ans << endl;
}
return 0;
}
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/1409 (转载时请注明本文出处及文章链接)


发表评论
快来吐槽一下吧!