一天蒜头君得到 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;
}