题目 :https://nanti.jisuanke.com/t/A2239
我的代码:(想到用map, 还是太弱,时间超限)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <map>
#include <queue>
#define IO ios::sync_with_stdio(false);\
cin.tie(0);\
cout.tie(0);
using namespace std;
const int maxn=1e5+5;
int n;
map<string,int> m;
string str;
int ans[maxn];
int main()
{
IO;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>str;
reverse(str.begin(),str.end());
m.insert(pair<string,int>(str,i));
}
map<string,int>::iterator it2;
for(map<string,int>::iterator it=m.begin();it!=m.end();it++)
{
int a=0;
string s1=it->first,s2="";
for(it2=it;it2!=m.end();it2++)
{
s2=it2->first;
for(int i=0;i<s1.size();i++)
{
if(s2[i]!=s1[i]) break;
}
a++;
}
ans[it->second]=a;
}
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}
大神:(用的神乎其神,很淡然)
#include <bits/stdc++.h>
using namespace std;
string a[100010];
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n;
map<string, int>mp;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
for (int j = 0; j < a[i].size(); j++) {
mp[a[i].substr(j)]++;
}
}
for (int i = 0; i < n; i++)
cout << mp[a[i]] << "\n";
return 0;
}
再一个大神(绝了)
#include <bits/stdc++.h>
#include<cstdio>
using namespace std;
#define ll long long
map<ll ,ll>mp; //记录所有后缀出现的个数
struct node
{
int len; //记录每个字符串的长度
ll val; //记录每个字符串的值,方便查询
char ss[15];
}s[100005];
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",&s[i].ss);
s[i].len=strlen(s[i].ss);
ll sum=0,cnt=1;
for(int j=s[i].len-1;j>=0;j--)
{
sum+=(s[i].ss[j]-'a'+1)*cnt;
mp[sum]++;
cnt*=26;
}
s[i].val=sum;
}
for(int i=0;i<n;i++)
{
printf("%lld\n",mp[s[i].val]);
}
return 0;
}
你见过的东西越多 ,遇到问题所能想到的越多,进而创造。
还需努力~