解析:
字符串不长,最大为10
考虑map做,将字符串转化为10位以内的26进制数
对每个字符串的所有后缀对应的26进制数贡献+1,遍历输出答案
ac:
#include<bits/stdc++.h>
#define MAXN 100005
#define ll long long
using namespace std;
map<ll,int> hashmap;
char ss[MAXN][11];
int main()
{
int n;
memset(ss,0,sizeof(ss));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",ss[i]);
int len=strlen(ss[i]);
ll ans=0;
for(int j=len-1;j>=0;j--)
{
ans=ans*26+ss[i][j]-'a'+1;//26位进制数
if(hashmap.find(ans)==hashmap.end())
hashmap[ans]=1;
else
hashmap[ans]++;
}
}
for(int i=0;i<n;i++)
{
int len=strlen(ss[i]);
ll ans=0;
for(int j=len-1;j>=0;j--)
ans=ans*26+ss[i][j]-'a'+1;
printf("%d\n",hashmap[ans]);
}
return 0;
}
http://codeforces.com/contest/1204/problem/D2
题意:
给一个串,让你构造另一个,两个串的任意(l,r)中的最长非降序列长度相同
解析:
从后往前处理
如果pp[i]==0,呢么他必定对后面的LIS产生影响,不能变
如果pp[i]==1,如果把他变成0,如果原本的LIS中,首项为1,不会改变LIS,
如果首项不为1,呢么LIS可能会发生改变
如果想把1->0,必须保证后面所有的区间的 LIS LISLIS 长度必须和 1 的个数相等
所以,从后向前统计 0 和 1 的数量,当 1 的个数大于等于 0 的个数时,才可以修改
ac:
#include<bits/stdc++.h>
#define MAXN 1000005
using namespace std;
char pp[MAXN];
int main()
{
scanf("%s",pp+1);
int len=strlen(pp+1);
int a=0,b=0;
for(int i=len;i>=1;i--)
{
a+=pp[i]=='1';
b+=pp[i]=='0';
if(a>b)
{
pp[i]='0';
a--;
}
}
printf("%s\n",pp+1);
return 0;
}