题目

in
5
mir
mirta
ta
ir
t
out
6
思路
把每一个输入的字符串的所有子串都++(此时需要用set来避免子串重复++,并且要用hash来记录所有子串对应的数量)
最后,把每一行“输入的”字符串对应的数字-1都加起来(对应的数字 代表着 有多少个主串的子串包含了这个输入的字符串,但是你得去掉自己匹配自己的情况)
由于懒就用STL的set和map了
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<string,int> m;
vector<string> v;
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
string str;
cin >> str;
v.push_back(str);
set<string> temps;
for(int j = 0; j < str.length(); j++)
{
for(int k = j + 1; k <= str.length(); k++)
temps.insert(str.substr(j, k - j));
}
for(set<string>::iterator it = temps.begin(); it != temps.end(); it++)
{
m[*it]++;
}
}
int sum = 0;
for(vector<string>::iterator it = v.begin(); it != v.end(); it++)
sum += m[*it] - 1;
cout << sum;
}
本文介绍了一种使用C++ STL中的set和map解决字符串子串计数的算法。通过输入字符串,找出所有子串并进行++操作,然后计算每行输入字符串被其他子串包含的次数(减去自身),最终输出总和。
1万+





