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; }