一天蒜头君得到 nn 个字符串 s_is
i
,每个字符串的长度都不超过 1010。
蒜头君在想,在这 nn 个字符串中,以 s_is
i
为后缀的字符串有多少个呢?
输入格式
第一行输入一个整数 nn。
接下来 nn 行,每行输入一个字符串 s_is
i
。
输出格式
输出 nn 个整数,第 ii 个整数表示以 s_is
i
为后缀的字符串的个数。
题解:把字符串看成一个26进制的数,用map统计所有后缀的个数就ok了
代码如下:
#include <bits/stdc++.h>
#include<cstdio>
using namespace std;
#define ll long long
map<ll ,ll>mp; //记录所有后缀出现的个数
struct node
{
int len; //记录每个字符串的长度
ll val; //记录每个字符串的值,方便查询
char ss[15];
}s[100005];
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",&s[i].ss);
s[i].len=strlen(s[i].ss);
ll sum=0,cnt=1;
for(int j=s[i].len-1;j>=0;j--)
{
sum+=(s[i].ss[j]-'a'+1)*cnt;
mp[sum]++;
cnt*=26;
}
s[i].val=sum;
}
for(int i=0;i<n;i++)
{
printf("%lld\n",mp[s[i].val]);
}
return 0;
}

本文介绍了一种使用26进制数值表示法和map数据结构来统计一组字符串中每个字符串作为后缀出现次数的算法。通过将字符串转换为数值并逐字符递增计算,可以高效地统计出所有字符串的后缀出现频率。
171万+

被折叠的 条评论
为什么被折叠?



