CF837

博客包含多道算法题,涉及单词大写字母统计、旗帜判断、矩形放置、数字相乘后缀0、自定义函数求值、数组操作次数及分段函数求和等问题。题解运用了动态规划、二分答案、矩阵快速幂、可持久化主席树等算法,还给出了相应代码。

A:

题意:

给一堆单词(用’ \space ’分开),问所有单词中单个单词大写字母最多有多少\

题解:

没什么好说的了主要是读懂题意
代码:

#include<bits/stdc++.h>
using namespace std;
int n;char ch[222];
signed main(){
    scanf("%d",&n);int ans = 0;
    while(scanf("%s",ch + 1) != EOF){
        int cnt = 0;for(int i = 1;i <= strlen(ch + 1);i++){if('A' <= ch[i] && ch[i] <= 'Z')cnt++;}
        ans = max(ans,cnt);
    }
    printf("%d\n",ans);
    return 0;
}

B:

题意:

Berland之旗是满足以下条件的 n×mn \times mn×m 矩形区域:

  • 旗中包含三种颜色,相应地以字母“R”, “G”和“B”表示。

  • 旗中包含三个“长条”,他们的长度和宽度相等(长条1的长度等于长条2的长度,也等于长条3的长度,宽度类似),并且互相平行,同时还平行于旗子的边缘。每个“长条”仅有一种颜色。

  • 每个颜色仅能在一个“长条”中出现。

现在给定由“R”, “G”和“B”构成的 n×mn \times mn×m 矩形区域。请判断它是否是一个正确的Berland之旗,是则输出 “YES”,否则输出"NO"。

题解:

所谓的??之旗就是让你找一个 nnn%3==03==03==0 或者 mmm%3==03==03==0,然后判断一下是不是分成三部分(想象一下用刀沿着n或m平均切三刀)每一部分颜色都相同且不重复

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 110;
int n, m;char ch[maxn][maxn];int a[maxn][maxn];
bool book[4];
bool check(int x,bool mod){
    if(mod){
        int col = a[1][m / 3 * x + 1];if(book[col])return 0;book[col] = 1;
        for(int i = 1;i <= n;i++){
            for(int j = m / 3 * x + 1;j <= m / 3 * (x + 1);j++){
                // printf("%d %d\n",i,j);
                if(a[i][j] != col)return false;
            }
        }
        return true;
    }
    else{
        int col = a[n / 3 * x + 1][1];if(book[col])return 0;book[col] = 1;
        for(int i = 1;i <= m;i++){
            for(int j = n / 3 * x + 1;j <= n / 3 * (x + 1);j++){
                if(a[j][i] != col)return false;
            }
        }
        return true;    
    }
}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;i++){
        scanf("%s",ch[i] + 1);
        for(int j = 1;j <= m;j++)
            a[i][j] = (ch[i][j] == 'R' ? 1 : (ch[i][j] == 'G' ? 2 : 3));
    }
    bool ans = 0;
    if(m % 3 == 0){
        bool res = 1;memset(book,0,sizeof(book));
        for(int i = 0;i <= 2;i++)if(!check(i,1)){res = 0;break;}
        ans |= res;
    }
    if(n % 3 == 0){
        bool res = 1;memset(book,0,sizeof(book));
        for(int i = 0;i <= 2;i++)if(!check(i,0)){res = 0;break;}
        ans |= res;
    }
    puts(ans ? "YES" : "NO");
    return 0;
}

C:

题意:

给一个 a∗ba*bab 的大矩形和 nnnxi∗yix_i*y_ixiyi 的小矩形(可旋转 90°90°90° ),要求找两个小矩形塞进大矩形中并且面积之和最大

题解:

放矩形的时候让一个的左上角顶在 (1,1)(1,1)(1,1) ,另一个的右下角顶在 (a,b)(a,b)(a,b) ,判断能不能放下就好了

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x = 0, f = 1;char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
    return x * f;
}
const int maxn = 110;
int x[maxn], y[maxn];
int n, a, b;
bool check(int xi,int yi,int xj,int yj){
    if(xi > a || xj > a || yi > b || yj > b)return false;
    if(xi + xj > a && yi + yj > b)return false;
    return true;
}
signed main(){
    int ans = 0;n = read();a = read(); b = read();
    for(int i = 1;i <= n;i++)x[i] = read(), y[i] = read();
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            if(i == j)continue;
            if(check(x[i],y[i],x[j],y[j]))ans = max(ans,x[i] * y[i] + x[j] * y[j]);
            if(check(y[i],x[i],x[j],y[j]))ans = max(ans,x[i] * y[i] + x[j] * y[j]);
            if(check(x[i],y[i],y[j],x[j]))ans = max(ans,x[i] * y[i] + x[j] * y[j]);
            if(check(y[i],x[i],y[j],x[j]))ans = max(ans,x[i] * y[i] + x[j] * y[j]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

D:

题意:

给你n个数,选k个数相乘使得结果的后缀0最多

题解:

幼儿园大班芝士可知后缀0由质因子中的2和5决定
于是乎定义 dpi,j,kdp_{i,j,k}dpi,j,k 表示取到第 iii 个数,已经取了 jjj 个数, 555 的质因子有 kkk 个时 222 的质因子最大值
然后dpi,j,kdp_{i,j,k}dpi,j,k = min(dpi−1,j,k,dpi−1,j−1,k−cnt5i+cnt2i)min(dp_{i-1,j,k},dp_{i-1,j-1,k-cnt5_i}+cnt2_i)min(dpi1,j,k,dpi1,j1,kcnt5i+cnt2i)
初始条件 dp0,0,0=0dp_{0,0,0}=0dp0,0,0=0 其余为 −INF-INFINF
然后显然发现这个是01背包可以把i维度优化掉
然后就没有然后了

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
    int x = 0, f = 1;char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
    return x * f;
}
const int maxn = 210;
int n, k;int a[maxn], b[maxn];
int dp[maxn][12810];//dp[i][j][k] = 当前到第i个数,选了j个数,5的因数为k个时2的因数最大值
signed main(){
    n = read();k = read();int x = 0;
    for(int i = 1;i <= n;i++){
        x = read();if(!x)continue;
        while(x % 2 == 0){a[i]++;x /= 2;}
        while(x % 5 == 0){b[i]++;x /= 5;}
    }
    memset(dp,~0x3f,sizeof(dp)); dp[0][0] = 0;
    for(int i = 1;i <= n;i++)
        for(int j = k;j >= 1;j--)
            for(int l = 12800;l >= b[i];l--)
                dp[j][l] = max(dp[j][l],dp[j - 1][l - b[i]] + a[i]);
    int ans = 0;
    for(int i = 0;i <= 12800;i++){ans = max(ans,min(i,dp[k][i]));}
    printf("%lld\n",ans);
    return 0;
}

E:

题意:

定义一个函数
f(n,m)={0,  (m=0)1+f(n,m−gcd(n,m)),  (m≠0)f(n,m) = \begin{cases} 0,\,\,(m=0)\\ 1+f(n,m-gcd(n,m)),\,\,(m\neq0)\\ \end{cases}f(n,m)={0,(m=0)1+f(n,mgcd(n,m)),(m=0)
然后给出nnnmmm,求f(n,m)f(n,m)f(n,m)

题解:

首先有一个推论 f(n,m)=f(ngcd(n,m),mgcd(n,m))f(n,m)=f(\frac{n}{gcd(n,m)},\frac{m}{gcd(n,m)})f(n,m)=f(gcd(n,m)n,gcd(n,m)m)
然后问题就变成了每次求最大的x<=mx<=mx<=m使得x∣nx|nxn然后f(n,m)=x+f(n,x)f(n,m)=x+f(n,x)f(n,m)=x+f(n,x)
这个好办,只需要把n的质因数都找出来(O(log⁡2n))O(\log_2n))O(log2n))
然后每次更新时只需要暴力枚举找到max(mmax(mmax(m%i)i)i),然后x就是前面的max值

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a, b;
const int maxn = 1e6 + 10;
bool book[maxn];int prime[maxn], cnt;
int x[maxn], p[maxn], tot;
int gcd(int x,int y){return y == 0 ? x : gcd(y,x % y);}
int f(int n,int m){
    int ans = 0;
    while(1){
        int mx = 0, pos = 0;
        for(int i = 1;i <= tot && x[i] <= m;i++)
            if(p[i] && (m / x[i] * x[i] > mx))mx = m / x[i] * x[i], pos = i;
        ans += m - mx;m = mx;
        if(!m)return ans;
        // if(m == 1){return ans + 1;}
        --p[pos];n /= x[pos]; m /= x[pos];
    }
    return -114514;
}
signed main(){
    scanf("%lld%lld",&a,&b);
    // book[1] = 1;int g = gcd(a, b);a /= g;b /= g;

    for(int i = 2;i <= 1e6;i++){
        if(!book[i]){prime[++cnt] = i;}
        for(int j = 1;j <= cnt && i * prime[j] <= 1e6;j++){
            book[i * prime[j]] = 1;
            if(i % prime[j] == 0)break;
        }
    }
    // for(int i = 1;i <= 10;i++)printf("prime[%lld] = %lld\n",i,prime[i]);
    int tmp = a;
    // tot++;x[tot] = 1;p[tot] = 1e18;
    for(int i = 1;i <= cnt && tmp >= prime[i];i++){
        if(tmp % prime[i] == 0){
            tot++;x[tot] = prime[i];while(tmp % prime[i] == 0){tmp /= prime[i];p[tot]++;}
        }
    }
    if(tmp != 1){tot++;x[tot] = tmp;p[tot] = 1;}
    // printf("%lld\n",tot);
    // for(int i = 1;i <= tot;i++)printf("x[%lld] = %lld,p[%lld] = %lld\n",i,x[i],i,p[i]);
    
    printf("%lld\n",f(a,b));

    return 0;
}

F:

题意:

给一个数组aaa,每次操作让新的aia_iai赋值为原来的∑j=1iaj\sum_{j=1}^{i}a_jj=1iaj,问最少多少次操作使得∃i,ai>=k\exist i,a_i>=ki,ai>=k

题解:

首先对于n==2n==2n==2的情况可以O(1)O(1)O(1)的计算答案(手推一下柿子就好了),对于n>10n>10n>10的情况可以暴力计算次数(由题解得最多计算410次),而对于2<n<=102<n<=102<n<=10的情况可以用二分答案+矩阵快速幂

细节:

  • 原数组中的前导零无意义,直接删除
  • 乘法需要用龟速乘并且大于kkk的数字没有乘的必要直接等于kkk即可

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
    int x = 0, f= 1;char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
    return x * f;
}
const int maxn = 2e5 + 10;
int n, k;
int a[maxn], tmp[maxn];
inline int mul(int a,int b){
    int res = 0;
    while(b){
        if(b & 1)res = res + a;
        if(res > k)return k;
        a = a + a;b >>= 1;a = min(k, a);
    }
    return res;
}
struct Matrix{
    int a[11][11];
    Matrix(){memset(a,0,sizeof(a));}
    friend Matrix operator * (Matrix a,Matrix b){
        Matrix ans;
        for(int i = 1;i <= n;i++)
            for(int t = 1;t <= n;t++)
                for(int j = 1;j <= n;j++){
                    ans.a[i][j] += mul(a.a[i][t] , b.a[t][j]);
                    if(ans.a[i][j] > k)ans.a[i][j] = k;
                }
        return ans;
    }
}A, B;
Matrix qpow(Matrix a,int x){
    Matrix res = a;x--;
    while(x){
        if(x & 1){res = res * a;}
        a = a * a;x >>= 1;
        // printf("x=  %lld\n",x);
    }
    return res;
}
bool check(int mid){
    Matrix res = A * qpow(B,mid);
    // puts("1111111111");
    for(int i = 1;i <= n;i++){if(res.a[1][i] >= k)return true;}
    return false;
}
signed main(){
    // #ifndef ONLINE_JUDGE
    // freopen("CF837F.in","r",stdin);
    // #endif
    n = read(); k = read();
    for(int i = 1;i <= n;i++)a[i] = read();
    int pos1 = 0, j = 1, book = 1;
    for(int i = 1;i <= n;i++){if(a[i] >= k){puts("0");return 0;}if(!a[i] && book)pos1 = i;else book = 0;}
    for(int i = pos1 + 1;i <= n;i++,j++){tmp[j] = a[i];}j--;
    for(int i = 1;i <= j;i++)a[i] = tmp[i];n = j;
    // printf("%lld\n",n);
    // for(int i = 1;i <= n;i++){printf("%lld ",a[i]);}
    if(n > 10){
        int cnt = 0;
        while(1){
            tmp[0] = 0;cnt++;
            for(int i = 1;i <= n;i++)tmp[i] = tmp[i - 1] + a[i];
            for(int i = 1;i <= n;i++){
                a[i] = tmp[i];
                if(a[i] >= k){printf("%lld\n",cnt);return 0;}
            }
        }
    }
    else if(n == 2){
        // if(a[2] >= k || a[1] >= k){puts("0");return 0;}
        int ans = (k - a[2]) / a[1] - 3;
        while(1){//精度修正
            if(ans * a[1] + a[2] >= k){printf("%lld\n",ans);return 0;}
            ans++;
        }
    }
    else{
        for(int i = 1;i <= n;i++){A.a[1][i] = a[i];}
        for(int i = 1;i <= n;i++)
            for(int j = n;j >= i;j--)
                B.a[i][j] = 1;
        int l = 1, r = 64356879284, mid = 0, ans = -1;
        // printf("n = %lld",n);
        while(l <= r){
            // printf("l=%lld r=%lld\n",l,r);
            mid = (r - l) / 2 + l;
            // printf("mid=%lld\n",mid);
            if(check(mid)){ans = mid;r = mid - 1;}
            else l = mid + 1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

G:

题意:

给出n个分段函数形如
fi(x)={y1,  (x<=x1)a∗x+b,  (x1<x<=x2)y2,  (x>x2)f_i(x)={ \begin{cases} y_1,\,\,(x<=x_1)\\ a*x+b,\,\,(x_1<x<=x_2)\\ y_2,\,\,(x>x_2) \end{cases} }fi(x)=y1,(x<=x1)ax+b,(x1<x<=x2)y2,(x>x2)
现在给出l,r,xl,r,xl,r,x,求∑i=lrfi(x)\sum_{i=l}^rf_i(x)i=lrfi(x),强制在线

题解:

首先先将原函数看作以下形式
fi(x)={0∗x+y1,  (x<=x1)a∗x+b,  (x1<x<=x2)0∗x+y2,  (x>x2)f_i(x)={ \begin{cases} 0*x+y_1,\,\,(x<=x_1)\\ a*x+b,\,\,(x_1<x<=x_2)\\ 0*x+y_2,\,\,(x>x_2) \end{cases} }fi(x)=0x+y1,(x<=x1)ax+b,(x1<x<=x2)0x+y2,(x>x2)
然后将所求柿子转化一下
∑i=lrfi(x)=∑i=lrai∗x+∑i=lrbi\sum_{i=l}^rf_i(x)=\sum_{i=l}^ra_i*x+\sum_{i=l}^rb_ii=lrfi(x)=i=lraix+i=lrbi
 \space   \space   \space   \space   \space   \space   \space   \space   \space   \space  =∑i=1rai∗x+∑i=1rbi−∑i=1l−1ai∗x+∑i=1l−1bi=\sum_{i=1}^ra_i*x+\sum_{i=1}^rb_i-\sum_{i=1}^{l-1}a_i*x+\sum_{i=1}^{l-1}b_i=i=1raix+i=1rbii=1l1aix+i=1l1bi
然后发现这玩应似乎可以可持久化主席树
然后就没啥了(那你还调了一下午)\

细节:

  • 线段树数组范围能开多大就多大(反正内存限制接近1GB)

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
    int x = 0, f = 1;char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
    return x * f;
}
const int maxn = 75100, mod = 1e9;
int n, m;
int a[maxn][3], b[maxn][3], x[maxn][2];
struct Segment_Tree{
    struct node{
        int l, r;int a, b;
        node(int a = 0,int b = 0,int l = 0,int r = 0):a(a),b(b),l(l),r(r){}
    }d[maxn * 160];
    int tot;
    int newnode(int p){d[++tot] = d[p];return tot;}
    void update(int &p,int l,int r,int s,int t,int a,int  b){
        p = newnode(p);
        if(s <= l && r <= t){d[p].a += a;d[p].b += b;return;}
        int mid = l + r >> 1;
        if(s <= mid)update(d[p].l,l,mid,s,t,a,b);
        if(mid < t)update(d[p].r,mid + 1,r,s,t,a,b);
    }
    int query(int p,int l,int r,int x){
        if(!p)return 0;
        int res = x * d[p].a + d[p].b;
        if(l == r)return res;
        int mid = l + r >> 1;
        if(x <= mid)res += query(d[p].l,l,mid,x);
        else res += query(d[p].r,mid + 1,r,x);
        return res;
    }
}tree;
int head[maxn << 2], sum[maxn];
signed main(){
    n = read();int mx = 0;
    for(int i = 1;i <= n;i++){
        x[i][0] = read();x[i][1] = read();b[i][0] = read();
        a[i][1] = read();b[i][1] = read();b[i][2] = read();
        head[i] = head[i - 1];
        tree.update(head[i],0,mod,0          ,x[i][0],a[i][0],b[i][0]);
        tree.update(head[i],0,mod,x[i][0] + 1,x[i][1],a[i][1],b[i][1]);
        tree.update(head[i],0,mod,x[i][1] + 1,mod    ,a[i][2],b[i][2]);
        sum[i] = sum[i - 1] + b[i][2];mx = max(mx,x[i][1] + 1);
    }
    m = read();int lastans = 0;
    for(int i = 1;i <= m;i++){
        int l = read(), r = read(), pos = (read() + lastans) % mod;
        if(pos >= mx)printf("%lld\n",lastans = sum[r] - sum[l - 1]);
        else printf("%lld\n",lastans = tree.query(head[r],0,mod,pos) - tree.query(head[l - 1],0,mod,pos));
    }
    return 0;
}
import requests import re from wordcloud import WordCloud import matplotlib.pyplot as plt headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0','cookie': 'ttwid=1%7C-j3HW8yR3TEYfq-AlkGHu9k4iHAf_LHEh_Q2PWAxIS0%7C1700556136%7Cf80dfe1ef2d4d944070e31b8b707946b6c607a4b5479dd8a74dc1f31468e4c43; bd_ticket_guard_client_web_domain=2; n_mh=-vHs5ZUkL9X2DgWA6Rj8WI61Wi7mEl9l679KgRxPqWc; sso_uid_tt=8e442ac66bced80ec2c8e3c70da51e08; sso_uid_tt_ss=8e442ac66bced80ec2c8e3c70da51e08; toutiao_sso_user=044ff7623ec59de756874cba76ce122b; toutiao_sso_user_ss=044ff7623ec59de756874cba76ce122b; passport_assist_user=Cjxte1ipeqS4SDMXsgplVYKIW6PSpF08ovQivcU_a2eGN8gSrUjxMiecRgJWMRbDDSNnPC569zl-SgbBAKYaSgo8xHm9MRGVF-4upl-dlAGsghXY45Zyp7rAi_EeMXQUqL1SUsX-kXmgq8jsLtucvk5zf0I2m8G-evzaBCjHEKXUww0Yia_WVCABIgEDz8YdXg%3D%3D; LOGIN_STATUS=1; store-region=cn-hn; store-region-src=uid; d_ticket=06a46aaa1655e30273b1a3f23d02180957646; my_rd=2; live_use_vvc=%22false%22; s_v_web_id=verify_lsyhfsaq_4e8b05b8_9de2_8d8f_1475_c29b7cb50b7d; _bd_ticket_crypt_cookie=d991096997ffe18cd6167109eaadf3e9; __live_version__=%221.1.1.8009%22; sid_ucp_v1=1.0.0-KDdiNmViZmRjZDMwNTc3ZWRlOTQ0ZTQwODI0MTQwNDczYzA1Mzc5N2EKGQj1kKWC3QIQ6MvyrgYY7zEgDDgGQPQHSAQaAmhsIiBkNzg5ZDI2NTEwODYyZjg2OGYxZWU2ODExOTQ3MzgyMA; ssid_ucp_v1=1.0.0-KDdiNmViZmRjZDMwNTc3ZWRlOTQ0ZTQwODI0MTQwNDczYzA1Mzc5N2EKGQj1kKWC3QIQ6MvyrgYY7zEgDDgGQPQHSAQaAmhsIiBkNzg5ZDI2NTEwODYyZjg2OGYxZWU2ODExOTQ3MzgyMA; xgplayer_device_id=33672337889; xgplayer_user_id=809594548975; dy_swidth=1920; dy_sheight=1080; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1920%2C%5C%22screen_height%5C%22%3A1080%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A20%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A50%7D%22; volume_info=%7B%22isUserMute%22%3Afalse%2C%22isMute%22%3Atrue%2C%22volume%22%3A0.986%7D; sid_ucp_sso_v1=1.0.0-KDA2ZThjZTFlZjk4YjA1NmJlOGFhMDE0MGM3NDQwMTJjZTFhYTNhMGEKHQj1kKWC3QIQt_jurwYY7zEgDDDLw8HUBTgGQPQHGgJobCIgMDQ0ZmY3NjIzZWM1OWRlNzU2ODc0Y2JhNzZjZTEyMmI; ssid_ucp_sso_v1=1.0.0-KDA2ZThjZTFlZjk4YjA1NmJlOGFhMDE0MGM3NDQwMTJjZTFhYTNhMGEKHQj1kKWC3QIQt_jurwYY7zEgDDDLw8HUBTgGQPQHGgJobCIgMDQ0ZmY3NjIzZWM1OWRlNzU2ODc0Y2JhNzZjZTEyMmI; sid_guard=044ff7623ec59de756874cba76ce122b%7C1710996535%7C5184001%7CMon%2C+20-May-2024+04%3A48%3A56+GMT; uid_tt=8e442ac66bced80ec2c8e3c70da51e08; uid_tt_ss=8e442ac66bced80ec2c8e3c70da51e08; sid_tt=044ff7623ec59de756874cba76ce122b; sessionid=044ff7623ec59de756874cba76ce122b; sessionid_ss=044ff7623ec59de756874cba76ce122b; __ac_nonce=066015c240024fb8050e9; __ac_signature=_02B4Z6wo00f01NXJH3AAAIDAI6AWVYCj8VjV6RvAAFN48v7c7HDZ8NdvLfZI1hL3FcExXG3aYk.POVrAAvIYCMSli0EPaw07Wd6wrh.GQc5wGzHAjtaQr47Fhmd4g-kVATerwj4-IZjjbY3127; strategyABtestKey=%221711365157.932%22; csrf_session_id=5b0235c112261b4bb95ec1cf837ca542; passport_csrf_token=0fcba5d746e895ebf5c0ca1177641928; passport_csrf_token_default=0fcba5d746e895ebf5c0ca1177641928; publish_badge_show_info=%220%2C0%2C0%2C1711365160640%22; download_guide=%223%2F20240325%2F0%22; pwa2=%220%7C0%7C3%7C0%22; douyin.com; device_web_cpu_core=20; device_web_memory_size=8; architecture=amd64; FOLLOW_LIVE_POINT_INFO=%22MS4wLjABAAAASI2CwQgXnN8K1EAMWpExImmColM3l2oObDxHT3_s0kI%2F1711382400000%2F0%2F0%2F1711367047224%22; FOLLOW_NUMBER_YELLOW_POINT_INFO=%22MS4wLjABAAAASI2CwQgXnN8K1EAMWpExImmColM3l2oObDxHT3_s0kI%2F1711382400000%2F0%2F1711366447224%2F0%22; xg_device_score=7.796995563243618; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A1%2C%5C%22is_mute%5C%22%3A1%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A0%7D%22; home_can_add_dy_2_desktop=%221%22; IsDouyinActive=false; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCS1dtTUU3QlJhN1czV2pRc3VYS1JIUFdNeG4vK3h1d2xYbjVUaGREQXc4T3k3Umt4dllRZ2ZTejMxZU9KRXZ5TXoxdTNXS3NDeWZLNTdjZ2NoWit6UEk9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoxfQ%3D%3D; passport_fe_beating_status=true; msToken=5ojun7cWfusf9JSrgH8E6ReJNPXc-y3Y4imqCppZwynprXybJ-dbTuKAHOEqe7AiBQp7E6nVcwfMTwjGJqTR5gg9OG1kkb6NwYNg1HBb8FPLd6jBokM=; tt_scid=dL2sJsTHa2fhSPdy3OGdJkDxbUI1vunW82s8UinrlJ6FH06Mw4I7pV.pEkF2X-Kc6ae0; odin_tt=f6c69791aa2cf50fca053d52424e688ff053a502c8a53a6ad481051d16372d1cc9a2f9c66c99ebf8e0ba3a85d8943c0ed4aeebb540da7eddd8b2590e2fe4f337e8263621cea51dbc4c90bfb70b0f8891; msToken=e2XPeN9Oe2rvoAwU_ILY7MPMQ2MunWV5Og_6YpYCSxC-RI37uxllzx-9AM48WWLBaf4qsVO3rTrqZu_oDbETP5Zxi3StSzTelW2WZX9T1vqKxdKgMiU=','referer': 'https://www.douyin.com/user/MS4wLjABAAAA9qetn0Lqj8qPFjbQ0BdiDSUiw0pvXhl3Q3z76mhKPng?modal_id=7343961897542208780&vid=7333925539343879460'} text_long = '' cursor = 0 while True: url = f'https://www.douyin.com/aweme/v1/web/comment/list/?device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id=7351224947882167562&cursor={cursor}&count=20&item_type=0&insert_ids=&whale_cut_token=&cut_version=1&rcFT=&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1920&screen_height=1080&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=122.0.0.0&browser_online=true&engine_name=Blink&engine_version=122.0.0.0&os_name=Windows&os_version=10&cpu_core_num=20&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7303832929826047507&msToken=WaHv3dZZz0ldCTHZZ0q4SmLSysTybxjwEDk0PXeIkVkrk6DlY6yExU1W3LlPAS08tEN6nKjKvVtS5sTEVhDSncZpbVics2p7Sx3A8Vgmr9PieMKmrvEkh8NQ4Why&X-Bogus=DFSzswVYuKsANxTQt-swjmD4OFXp' JSON = requests.get(url, headers=headers).json() 若干条评论数据 = JSON['comments'] for 一条评论数据 in 若干条评论数据: 评论的话 = 一条评论数据['text'] print(f'{评论的话}') text_long += 评论的话 if JSON['has_more'] == 0: break cursor = JSON['cursor'] open('评论.txt', 'w', encoding='utf-8').write(text_long) text_long = open('评论.txt', 'r', encoding='utf-8').read() text_long = re.sub(r'\[.*?\]', '', text_long) wordcloud = WordCloud(font_path='字魂联盟综艺体.ttf', width=1920, height=1080, background_color='white').generate(text_long) plt.imshow(wordcloud, interpolation='bilinear') plt.show() 分析代码
06-15
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值