1. 程式人生 > >【CF1043C】Smallest Word(構造)

【CF1043C】Smallest Word(構造)

pan %s 字典 ostream 字符串 signed 字符串排序 pair printf

題意:給定一個由a和b構成的字符串,可以選擇翻轉或不翻轉他的每個前綴,翻轉記為1不翻轉記為0,求能將字符串排序的字典序最小的操作序列

n<=1e3

思路:考慮極長的一段a [t,w]

翻轉t-1與w就能把這段a移到最前面

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8
#include<queue> 9 #include<vector> 10 #include<ctime> 11 using namespace std; 12 typedef long long ll; 13 typedef unsigned int uint; 14 typedef unsigned long long ull; 15 typedef pair<int,int> PII; 16 typedef vector<int> VI; 17 #define fi first 18 #define se second 19
#define MP make_pair 20 #define N 210000 21 #define M 130 22 #define MOD 1000000007 23 #define eps 1e-8 24 #define pi acos(-1) 25 26 char a[N]; 27 int b[N],c[N]; 28 29 int main() 30 { 31 scanf("%s",a+1); 32 int n=strlen(a+1); 33 for(int i=1;i<=n;i++) 34 if(a[i]==a) c[i]=0; 35 else c[i]=1
; 36 37 int i=0; 38 memset(b,0,sizeof(b)); 39 while(i<=n) 40 { 41 i++; 42 if(c[i]==1||i>n) continue; 43 int t=i; 44 int w=i; 45 while(i+1<=n&&c[i+1]==0){i++; w++;} 46 b[t-1]^=1; b[w]^=1; 47 } 48 for(int i=1;i<=n-1;i++) printf("%d ",b[i]); 49 printf("%d",b[n]); 50 return 0;

【CF1043C】Smallest Word(構造)