G
题目大概:
给出长度为n的字符串,q此操作,然后id,字符q,把id位置的字符替换为q,看是否是回文串。最后问q此操作有几次操作之后是回文串。
思路:
根据数据,暴力显然是不行的,长度和操作数都是1e5.
可以先把给出的字符串按照对称位置,计算有多少个对称位置不同记为sum。然后,每次修改的时候,比较和对称位置的变化情况,然后维护sum值,当sum为0的时候就是回文串。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
const int maxn=110000;
const int mod=1e9+7;
using namespace std;
char a[maxn];
int pan(char b[])
{
int l=strlen(b);
char c[maxn];
for(int i=0;i<l;i++)
{
c[i]=b[l-i-1];
}
int ans=0;
for(int i=0;i<l/2;i++)
{
if(b[i]!=c[i])
{
ans++;
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d%s",&n,&m,a);
int ans=0;
int l=strlen(a);
int sum=pan(a);
for(int i=1;i<=m;i++)
{
int id;
char q;
scanf("%d %c",&id,&q);
id--;
if(a[l-1-id]==a[id])
{
a[id]=q;
if(a[l-1-id]==a[id])
{
}
else sum++;
if(sum==0)ans++;
}
else
{
a[id]=q;
if(a[l-1-id]==a[id])
{
sum--;
}
if(sum==0)ans++;
}
//printf("%d\n",sum);
}
printf("%d\n",ans);
}
return 0;
}
H
题目大概:
有两只队伍踢足球,分别再自己场地和另一方场地踢球。哪一方进球多,哪一方就赢了,去过数量相同。哪一方在对手场地进球多,便哪一方赢了,如果都相同,则返回-1.
思路:
按照题目大概模拟一遍。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
const int maxn=110000;
const int mod=1e9+7;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int sum1=a+c;
int sum2=b+d;
if(sum1>sum2)
{
printf("1\n");
}
else if(sum1<sum2)
{
printf("2\n");
}
else if(sum1==sum2)
{
if(c>b)
{
printf("1\n");
}
else if(c<b)
{
printf("2\n");
}
else
{
printf("-1\n");
}
}
}
return 0;
}