后缀字符串 计蒜客模拟赛

一天蒜头君得到 nnn 个字符串 sis_isi,每个字符串的长度都不超过 101010。

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

输入格式

第一行输入一个整数 nnn。

接下来 nnn 行,每行输入一个字符串 sis_isi

输出格式

输出 nnn 个整数,第 iii 个整数表示以 sis_isi 为后缀的字符串的个数。

数据范围

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

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

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

样例输入

3
ba
a
aba

样例输出

2
3
1


用map和string配合使用。代码很短。
其中string里面的substr()函数,
s.substr(0,5)返回的是s里面0-4这五个字符。
s.substr(5) 返回的是s里面第5个到末尾的所有字符。
所以这个题目,就可以讲输出的字符串存到map<string,int>里面。 每一个子串的数量从0开始,mp【子串】++计数。然后直接输出map【s[i]】,也就是后缀字符串的数量了。
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <map>
 5 using namespace std;
 6 const int maxn = 1e5+9;
 7 int n;
 8 string s[maxn];
 9 map<string,int> mp;
10 int main()
11 {
12     scanf("%d",&n);
13     for(int i = 0; i < n; i++)
14     {
15         cin>>s[i];
16         for(int j = 0; j < s[i].length(); j++)
17             mp[s[i].substr(j)]++;
18     }
19     for(int i = 0; i < n; i++)
20         cout<<mp[s[i]]<<endl;
21     return 0;
22 }
View Code

 

posted @ 2019-02-02 11:22  stul  阅读(155)  评论(0编辑  收藏  举报