链接:http://codeforces.com/contest/1138/problem/D
啊啊啊啊啊啊,自闭啊,比赛的时候判断条件 if(s1[i-1]=='0') aa++;写成了 if(s1[i]=='0') aa++;少写了个-1,被hack了,上分场变成了掉分场。
思路;
题目需要t字符串出现次数最多,那么找到最大的重叠部分就好了,然后依次加上就好了
主要就是要找到字符串t与本身的重叠部分,,假设有两个t,第一个t不变,第二个t向右移动:
比如:
10101010
-10101010 -> 一直向右移直到重叠部分相等
如:
10101010
-- 10101010 如这种情况 重叠部分为: 101010 ,题目需要最多的t字符串,我们只需要先摆上一个 t ,然后每补上一次t重叠部分这样就可以多出现一次t.最后算下能出现几次,输出出来,剩余的0和1直接跟在后面输出。
实现代码:
#include<bits/stdc++.h> using namespace std; #define mid int m = (l + r) >> 1 #define ll long long const int M = 1e5 + 10; string s,s1; int main() { int a=0,b=0,a1=0,b1=0; cin>>s; int len = s.size(); cin>>s1; int len1 = s1.size(); for(int i = 0;i < len;i ++){ if(s[i]=='0') a++; else b++; } for(int i = 0;i < len1;i ++){ if(s1[i]=='0') a1++; else b1++; } int k; if(a1==0) k = b/b1; else if(b1 == 0) k = a/a1; else k = min(a/a1,b/b1); if(k==0){ cout<<s<<endl; } else{ int en = len1; int aa = 0,bb = 0,aa1 = 0,bb1 =0; for(int i = 1;i < len1;i ++){ int flag = 0; if(s1[i-1]=='0') aa++; else bb++; if(s1[len1-i]=='0') aa1++; else bb1++; if(aa!=aa1||bb!=bb1) continue; for(int j = 0;j < len1-i;j ++){ if(s1[i+j]!=s1[j]){ flag = 1; break; } } if(flag == 0){ en = i; break; } } //cout<<en<<endl; int a2 = 0;int b2 = 0; if(en != len1){ for(int i = len1 - en;i < len1;i ++){ if(s1[i]=='0') a2++; else b2++; } } else { a2 = a1,b2 = b1; } a-=a1; b-=b1; cout<<s1; int k1; if(a2==0) k1 = b/b2; else if(b2 == 0) k1 = a/a2; else k1 = min(a/a2,b/b2); for(int i = 1;i <= k1;i ++){ for(int j = len1-en;j < len1;j ++) cout<<s1[j]; } a -= a2*k1; b -= b2*k1; for(int i = 1;i <= a;i ++) cout<<0; for(int i = 1;i <= b;i ++) cout<<1; cout<<endl; } }