子串分值
1、非动态规划(n的三次方)
没用memset的原因是部分测试数据会出错
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<limits.h>
int main()
{
char arr[100000+1];
int zm[26];
int a;
for(a=0;a<26;a++)
{
zm[a]=0;
}
//memset(zm, 0, 26);
gets(arr);
int i,j,k,len=strlen(arr);
long long s=0LL;
for(i=0;i<len;i++)
{
for(j=i;j<len;j++)
{
for(k=i;k<=j;k++)
{
if(zm[arr[k]-'a']==0)
{
s++;
}
else
{
if(zm[arr[k]-'a']==1)
s--;
else
continue;
}
zm[arr[k]-'a']++;
}
//memset(zm, 0, 26);
for(a=0;a<26;a++)
{
zm[a]=0;
}
}
}
printf("%lld",s);
return 0;
}
2、求各个字母贡献值(n的平方)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<limits.h>
int main()
{
char arr[100000+1];
scanf("%s",arr);
int pro,last,i,j,k,len=strlen(arr);
long long ans=0LL;
for(i=0;i<len;i++)
{
j=1;k=1;
for(pro=i-1;pro>=0;pro--)
{
if(arr[pro]==arr[i])
{
j=i-pro;
goto A;
}
}
j=i+1;
A:
for(last=i+1;last<len;last++)
{
if(arr[last]==arr[i])
{
k=last-i;
goto B;
}
}
k=len-i;
B:
ans+=(j*k);
}
printf("%lld",ans);
return 0;
}
3、动态规划(n)
没用memset的原因同上
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<limits.h>
enum
{
ZD=100000+1,
Q=0,
H=1,
WU=-1,
};
long long q_fzh(int ,char[]);
int main()
{
char s[ZD];
scanf("%s",s);
printf("%lld",q_fzh(strlen(s),s));
return 0;
}
long long q_fzh(int cd,char s[])
{
long long fzh=0LL;
int wz['z'-'a'+1][2]={{WU,WU},{WU,WU},{WU,WU},{WU,WU},{WU,WU},
{WU,WU},{WU,WU},{WU,WU},{WU,WU},{WU,WU},
{WU,WU},{WU,WU},{WU,WU},{WU,WU},{WU,WU},
{WU,WU},{WU,WU},{WU,WU},{WU,WU},{WU,WU},
{WU,WU},{WU,WU},{WU,WU},{WU,WU},{WU,WU},{WU,WU}};
//memset(wz,-1,52);
int xb;
for(xb=0;s[xb]!='\0';xb++,cd--)
{
fzh+=(xb-wz[s[xb]-'a'][H])*cd
-(wz[s[xb]-'a'][H]-wz[s[xb]-'a'][Q])*cd;
wz[s[xb]-'a'][Q]=wz[s[xb]-'a'][H];
wz[s[xb]-'a'][H]=xb;
}
return fzh;
}