题意:给n个字符串,问一个字符串是另一个字符串的子串的个数有多少
解题思路:用map存下所有的字符串,然后用set处理出每个串的不同子串,在map里查询数量,注意要减去匹配自己的情况。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<string.h>
using namespace std;
set<string>s;
map<string,int>mp;
char a[200005][100];
char c[20];
int checkl(char b[])
{
s.clear();
int lb=strlen(b);
int sum=0;
for(int i=0;i<lb;i++)
{
int g=0;
for(int j=i;j<lb;j++)
{
c[g]=b[j];
g++;
c[g]='\0';
if(s.find(c)!=s.end())
continue;
s.insert(c);
sum=sum+mp[c];
}
for(int k=0;k<=19;k++)
{
c[k]=0;
}
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
s.clear();
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]);
mp[a[i]]++;
// s.insert(a[i]);
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=ans+checkl(a[i])-1;
}
printf("%d\n",ans);
return 0;
}