当前位置:   article > 正文

蓝桥杯省赛模拟题-后缀字符串_接下来nn行,每行长度不大于100的字符串,第ii行表示第ii个数据,保存在第ii个数

接下来nn行,每行长度不大于100的字符串,第ii行表示第ii个数据,保存在第ii个数

一天蒜头君得到 nn 个字符串 s_isi​,每个字符串的长度都不超过 1010。

蒜头君在想,在这 nn 个字符串中,以 s_isi​ 为后缀的字符串有多少个呢?

输入格式

第一行输入一个整数 nn。

接下来 nn 行,每行输入一个字符串 s_isi​。

输出格式

输出 nn 个整数,第 ii 个整数表示以 s_isi​ 为后缀的字符串的个数。

数据范围

对于 50\%50% 的数据,1 \le n \le 10^31≤n≤103。

对于 100\%100% 的数据,1 \le n \le 10^51≤n≤105。

所有的字符串仅由小写字母组成。

样例输入复制

3
ba
a
aba

样例输出复制

2
3
1

题目来源

2019 蓝桥杯省赛 B 组模拟赛(一)

 

因为题目中只包含a-z小写字母,所以可以把字符串看为26进制的数字,然后用map记录下在二十六进制转换为十进制时每个后缀出现的次数

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int LL;
  4. const int MAXN(5*1e5);
  5. const LL INF(0x7f7f7f7f7f7f7f7f);
  6. map<LL,int>mp;
  7. LL a[MAXN+50];
  8. int main() {
  9. int n;
  10. char str[20];
  11. scanf("%d",&n);
  12. for(int i=1;i<=n;i++) {
  13. scanf("%s",str);
  14. LL temp=0,digit=1;
  15. for(int j=strlen(str)-1;j>=0;j--) {
  16. temp=temp+(str[j]-'a'+1)*digit;
  17. mp[temp]++;
  18. digit*=26;
  19. }
  20. a[i]=temp;
  21. }
  22. for(int i=1;i<=n;i++) {
  23. cout<<mp[a[i]]<<endl;
  24. }
  25. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/799617
推荐阅读
相关标签
  

闽ICP备14008679号