http://oj.ecustacm.cn/problem.php?id=1271
这道题最早的思路是把字符串枚举所有的以 8个连续的字符串 并把它们标记为true。
根据输入找到就 加1。
后来才发现题目给的匹配条件是 两个字符串的只要各个字母的个数相同就是一次匹配。
这让我蒙蔽了,这俩字符串该如何匹配啊? 后来一想只要把每个字符串字典序排序比较就ok了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
map<string,int>mp;
int ans=0;
int main(void)
{
string str;
cin>>str;
int i;
int n;
cin>>n;
string s[1005];
for(i=0;i<n;i++)
{
cin>>s[i];
}
for(i=0;i<=str.size()-8;i++)
{
string ss=str.substr(i,8);//每8个一组
sort(ss.begin(),ss.end());//排序存储,保存其出现的个数
mp[ss]++;
}
for(i=0;i<n;i++)
{
sort(s[i].begin(),s[i].end());//先排序再匹配
ans+=mp[s[i]];
}
cout<<ans<<endl;
return 0;
}
压缩版:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int ans=0;
map<string,int> mp;
int main(void)
{
string str; cin>>str;
int n; cin>>n;
int i;
string s[1005];
for(i=0;i<n;i++) cin>>s[i];
for(i=0;i<=str.size()-8;i++)
{
string ss=str.substr(i,8);
sort(ss.begin(),ss.end());
mp[ss]++;//统计个数
}
for(i=0;i<n;i++)
{
sort(s[i].begin(),s[i].end());
ans+=mp[s[i]];
}
cout<<ans<<endl;
return 0;
}
总结: 本题的关键点在于要将每一段排序。很重要。