SDUT《数据结构与算法》专题训练4 串 复刻版

考研复习限定复刻开催 好评配信中!

数据结构实验之串一:KMP简单应用

Description

给定两个字符串string1和string2,判断string2是否为string1的子串。

Input

输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

Output

对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

Sample

Input

abc
a
123456
45
abc
ddd

Output

1
4
-1

Reference Code

#include<stdio.h>
#include<string.h>
void get_next(char *t,int *next)
{
    int len = strlen(t);
    int i = 0, j = -1;
    next[i] = j;
    while (i<len-1)
    {
        if(j==-1||t[i]==t[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
}

int kmp(char *s,char *t,int *next)
{
    int len1 = strlen(s), len2 = strlen(t);
    int i = 0, j = 0;
    while (i<len1&&j<len2)
    {
        if (j==-1||s[i]==t[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
    }
    if (j>=len2)
        return i - len2 + 1;
    return -1;
}

int main()
{
    char s[1000000], t[1000000];
    int next[1000000];
    while (scanf("%s",s)!=EOF)
    {
        scanf("%s", t);
        get_next(t, next);
        printf("%d\n", kmp(s, t, next));
    }
    return 0;
}

数据结构实验之串三:KMP应用

Description

有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?

Input

首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。

之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。

Output

如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1

Sample

Input

5
1 2 3 4 5
3
2 3 4

Output

2 4

Reference Code

#include <stdio.h>
#include <stdlib.h>
int a[1100000], b[1100000];
int next[1100000];
void getnext(int b[], int m)
{
    int i = 0, j = -1;
    next[0] = -1;
    while (i < m)
    {
        if (j == -1 || b[i] == b[j])
        {
            i++;
            j++;
            if (b[i] != b[j])
                next[i] = j;
            else
                next[i] = next[j];
        }
        else
            j = next[j];
    }
}

int kmp(int a[], int b[], int n, int m, int p)
{
    int i = p, j = 0;
    while (i < n && j < m)
    {
        if (j == -1 || a[i] == b[j])
        {
            i++;
            j++;
        }
        else
            j = next[j];
    }
    if (j == m)
        return i - j + 1;
    else
        return -1;
}

int main()
{
    int i, n, m, x, y;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &m);
    for (i = 0; i < m; i++)
    {
        scanf("%d", &b[i]);
    }
    getnext(b, m);
    x = kmp(a, b, n, m, 0);
    if (x == -1)
        printf("-1\n");
    else
    {
        y = kmp(a, b, n, m, x);
        if (y == -1)
            printf("%d %d\n", x, x + m - 1);
        else
            printf("-1\n");
    }
    return 0;
}

数据结构实验之串二:字符串匹配

Description

给定两个字符串string1和string2,判断string2是否为string1的子串。

Input

输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格。(string1和string2大小不超过100字符)

Output

对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO"。

Sample

Input

abc
a
123456
45
abc
ddd

Output

YES
YES
NO

Reference Code

#include <stdio.h>
#include <string.h>
void get_next(char *t, int *next)
{
  int len = strlen(t);
  int i = 0, j = -1;
  next[i] = j;
  while (i < len - 1)
  {
    if (j == -1 || t[i] == t[j])
    {
      i++;
      j++;
      next[i] = j;
    }
    else
    {
      j = next[j];
    }
  }
}

int kmp(char *s, char *t, int *next)
{
  int len1 = strlen(s), len2 = strlen(t);
  int i = 0, j = 0;
  while (i < len1 && j < len2)
  {
    if (j == -1 || s[i] == t[j])
    {
      i++;
      j++;
    }
    else
    {
      j = next[j];
    }
  }
  if (j >= len2)
    return i - len2 + 1;
  return -1;
}

int main()
{
  char s[10000], t[10000];
  int next[10000];
  while (scanf("%s", s) != EOF)
  {
    scanf("%s", t);
    get_next(t, next);
    if (kmp(s, t, next) > 0)
    {
      printf("YES\n");
    }
    else
    {
      printf("NO\n");
    }
  }
  return 0;
}

串结构练习——字符串连接

Description

给定两个字符串string1和string2,将字符串string2连接在string1的后面,并将连接后的字符串输出。

连接后字符串长度不超过110。

Input

输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2。

Output

对于每组输入数据,对应输出连接后的字符串,每组输出占一行。

Sample

Input

123
654
abs
sfg

Output

123654
abssfg

Reference Code

#include <stdio.h>
#include <string.h>
int main()
{
  char str1[110], str2[110];
  while (~scanf("%s", str1))
  {
    scanf("%s", str2);
    strcat(str1, str2);
    printf("%s\n", str1);
  }
}

学密码学一定得学程序

Description

曾经,ZYJ同学非常喜欢密码学。有一天,他发现了一个很长很长的字符串S1。他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2。但是很不幸的是,WL忘记跟他说是什么意思了。这个时候,ZYJ不得不求助与伟大的ZP。ZP笑了笑说,这个很神奇的,WL的意思是只要你找到她给你的字符串在那个神奇的字符串的位置,你就会有神奇的发现。ZYJ恍然大悟,原来如此,但是悲剧来了,他竟然不知道怎么找。。。。是的,很囧是不是。所以这时候就需要化身为超级玛丽亚的你现身了,告诉他吧。。。。。。

Input

首先输入一个n。表示有n组测试数据。

每组测试数据有两行。

第一行为字符串S1,长度不大于1000000。

第二行为字符串S2,长度不大于10000,并且长度不小于2。

Output

输出S2在S1的位置。如果有多个位置,只输出第一个位置。

如果找不到,就输出“::>_<::“(不输出双引号)。

Sample

Input

1
ASDFGDF
DF

Output

3

Reference Code

#include <stdio.h>
#include <string.h>
#define inf 1000001
#define dfs 10001
char str1[inf], str2[dfs];
int next[dfs];
void GetNext(char *p, int next[])
{
  int pLen = strlen(p);
  next[0] = -1;
  int k = -1;
  int j = 0;
  while (j < pLen - 1)
  {
    if (k == -1 || p[j] == p[k])
    {
      ++k;
      ++j;
      next[j] = k;
    }
    else
      k = next[k];
  }
}
int KmpSearch(char *s, char *p)
{
  int i = 0;
  int j = 0;
  int sLen = strlen(s);
  int pLen = strlen(p);
  while (i < sLen && j < pLen)
  {
    if (j == -1 || s[i] == p[j])
    {
      i++;
      j++;
    }
    else
      j = next[j];
  }
  if (j == pLen)
    printf("%d\n", i - j + 1);
  else
    printf("::>_<::\n");
  return 0;
}
int main()
{
  int n;
  scanf("%d", &n);
  while (n--)
  {
    scanf("%s%s", &str1, &str2);
    GetNext(str2, next);
    KmpSearch(str1, str2);
  }
  return 0;
}

数据结构实验之数组二:稀疏矩阵

Description

对于一个n*n的稀疏矩阵M(1 <= n <= 1000),采用三元组顺序表存储表示,查找从键盘输入的某个非零数据是否在稀疏矩阵中,如果存在则输出OK,不存在则输出ERROR。稀疏矩阵示例图如下:

img

Input

连续输入多组数据,每组数据的第一行是三个整数mu, nu, tu(tu<=50),分别表示稀疏矩阵的行数、列数和矩阵中非零元素的个数,数据之间用空格间隔,随后tu行输入稀疏矩阵的非零元素所在的行、列值和非零元素的值,每组数据的最后一行输入要查询的数据k。

Output

输出查询结果,查找成功输出OK,找不到输出ERROR。

Sample

Input

3 5 5
1 2 14
1 5 -5
2 2 -7
3 1 36
3 4 28
36

Output

OK

Reference Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
  int x;
  int y;
  int data;
} a[1001];
int main()
{
  int mu, nu, tu, flag, k, i;
  while (~scanf("%d%d%d", &mu, &nu, &tu))
  {
    flag = 0;
    for (i = 0; i < tu; i++)
    {
      scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].data);
    }
    scanf("%d", &k);
    for (i = 0; i < tu; i++)
    {
      if (a[i].data == k)
      {
        flag = 1;
        break;
      }
    }
    if (flag == 1)
      printf("OK\n");
    else
      printf("ERROR\n");
  }
  return 0;
}

数据结构实验之数组三:快速转置

Description

转置运算是一种最简单的矩阵运算,对于一个mn的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它的转置矩阵T是一个nm的矩阵,且T( i , j )=M( j , i )。显然,一个稀疏矩阵的转置仍然是稀疏矩阵。你的任务是对给定一个m*n的稀疏矩阵( m , n < = 10000 ),求该矩阵的转置矩阵并输出。矩阵M和转置后的矩阵T如下图示例所示。

img
img

稀疏矩阵M 稀疏矩阵T

Input

连续输入多组数据,每组数据的第一行是三个整数mu, nu, tu(tu <= 50),分别表示稀疏矩阵的行数、列数和矩阵中非零元素的个数,随后tu行输入稀疏矩阵的非零元素所在的行、列值和非零元素的值,同一行数据之间用空格间隔。(矩阵以行序为主序)

Output

输出转置后的稀疏矩阵的三元组顺序表表示。

Sample

Input

3 5 5
1 2 14
1 5 -5
2 2 -7
3 1 36
3 4 28

Output

1 3 36
2 1 14
2 2 -7
4 3 28
5 1 -5

Reference Code


#include <stdio.h> #include <string.h> struct st { int x, y, z; } a[101], t; int main() { int n, m, d; while (scanf("%d%d%d", &n, &m, &d) != EOF) { int i, j; for (i = 0; i < d; i++) scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z); for (i = 0; i < d - 1; i++) { for (j = 0; j < d - i - 1; j++) { if (a[j].y > a[j + 1].y) { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } else if (a[j].y == a[j + 1].y) { if (a[j].x > a[j + 1].x) { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } } for (i = 0; i < d; i++) { printf("%d %d %d\n", a[i].y, a[i].x, a[i].z); } } return 0; }

cyk追楠神系列三

Description

众所周知,cyk给楠神写了一封信表白。作为有一个有礼貌的五好青年,楠神当然得给 cyk 写一封回信咯,俗称“好人信”。

楠神是一个非常有文采的人,他在信里引用了很多名言来安慰 cyk,有时候他觉得一句话很好的话,他会引用很多次。现在他想考考 cyk,在告诉 cyk 里面每句名言的情况下,看看 cyk 能不能找到每局名言在信里被引用了多少次。如果能找到的话,说明 cyk 也是一个有涵养的人,楠神对 cyk 的好感度就会增加。

cyk 语文和眼力那么差,当然不行咯,所以你赶快帮帮 cyk 吧!

Input

输入数据有多组(数据组数不超过 50),到 EOF 结束。

每组数据第一行输入一串字符串,代表楠神写的回信,长度不超过 10^6。

第二行输出 n (1 <= n <= 100),接下来 n 行每行一个字符串,代表楠神引用的名言,长度不超过 10^6。

Output

每组数据中,对于每句名言输出他被引用的次数,每个答案占一行。

Sample

Input

In fact, maybe we can become good friend, but don't lose hear for yourselves, when there is a will, there is a way, you can become a better man~
1
when there is a will, there is a way

Output

1

Hint

子串在主串中的匹配允许重叠。

Reference Code

#include <stdio.h>
#include <string.h>
#define MAX 1000005
char s[MAX], t[MAX];
int next[MAX];
void get_next()
{
  int i, k = 0;
  next[0] = 0;
  for (i = 1; t[i]; i++)
  {
    while (k > 0 && t[k] != t[i])
      k = next[k - 1];
    if (t[k] == t[i])
      k++;
    next[i] = k;
  }
}
int kmp()
{
  int i = 0, j = 0;
  int len1 = strlen(s);
  int len2 = strlen(t);
  int counter = 0;
  for (i = 0; i < len1; i++)
  {
    while (j > 0 && t[j] != s[i])
      j = next[j - 1];
    if (t[j] == s[i])
      j++;
    if (j == len2)
    {
      counter++;
    }
  }
  return counter;
}
int main()
{
  int n, x;
  while (gets(s))
  {
    scanf("%d\n", &x);
    while (x--)
    {
      gets(t);
      get_next();
      n = kmp();
      printf("%d\n", n);
    }
  }
  return 0;
}

bLue的二叉树

Description

Keke 是一个喜爱种树的人,他对各种树都有很深的研究。

MLE 听说 bLue 种了一些新品种的树,就想邀请 Keke 去围观一下。

PBH 在暗中把这一切尽收眼底,作为资深植树行家,他虽不屑,但也决定和他们一起去看一看。

于是,大家便一起到了 bLue 家去看树。

bLue 有两棵二叉树,分别有 n 和 m 个节点,编号分别为 1-n 和 1-m,每个节点都有一个权值,bLue 想知道第一棵树的所有子树中与第二棵树完全相同的个数(不考虑节点编号)。

Input

输入数据有多组(数据组数不超过 150),到 EOF 结束。

对于每组数据:

  • 第一行有两个整数 n (0 < n <= 10^5) 和 m (0 < m <= 10^5),表示第一棵树和第二棵树的节点个数
  • 接下来 n 行,表示第一棵树:第 i (0 < i <= n) 行有 3 个整数,w[i] (0 < w[i] <= 10), lc[i], rc[i] (0 < lc[i], rc[i] <= n),分别表示节点 i 的权值,该节点的左孩子编号和右孩子编号,若某个孩子不存在,则为 0 (数据保证每棵树都是合法的有根二叉树)
  • 接下来 m 行,表示第二棵树:格式同第一棵树

保证:树的最大深度不会超过 10000。

Output

对于每组数据,输出一行一个整数 num,表示第一棵树的所有子树中与第二棵树完全相同的个数。

Sample

Input

7 4
1 6 3
2 0 4
1 7 0
3 0 0
1 2 1
2 0 0
2 0 0
2 0 0
1 4 0
1 1 2
2 0 0
3 3
1 0 0
2 1 3
3 0 0
1 0 3
2 1 0
3 0 0

Output

1
0

Hint

数据量比较大,推荐用 scanf 等读入。

Reference Code

#include <stdio.h>
#include <stdlib.h>
#define LL long long
#define MEM(a, b) memset(a, b, sizeof(a))
struct Node
{
  int w, lc, rc;
};
struct Node a[100005], b[100005];
int avis[100005], bvis[100005];
int na[100005 * 3 + 10], nb[100005 * 3 + 10];
int nest[100005 * 3 + 10];
int la, lb;
void adfs(int x)
{
  na[la++] = a[x].w;
  if (x == 0)
    return;
  adfs(a[x].lc);
  adfs(a[x].rc);
}
void bdfs(int x)
{
  nb[lb++] = b[x].w;
  if (x == 0)
    return;
  bdfs(b[x].lc);
  bdfs(b[x].rc);
}
void Getnest(int n)
{
  int j = 0;
  int i = 1;
  nest[1] = 0;
  while (i <= n)
  {
    if (j == 0 || nb[i] == nb[j])
    {
      j++;
      i++;
      if (nb[i] == nb[j])
        nest[i] = nest[j];
      else
        nest[i] = j;
    }
    else
      j = nest[j];
  }
}
int kmp(int n, int m)
{
  int i = 1;
  int j = 1;
  int ans = 0;
  while (i <= n)
  {
    if (j == 0 || na[i] == nb[j])
    {
      i++;
      j++;
    }
    else
      j = nest[j];
    if (j >= m + 1)
    {
      ans++;
      j = nest[j];
    }
  }
  return ans;
}
int main()
{
  int n, m;
  while (scanf("%d %d", &n, &m) != EOF)
  {
    MEM(avis, 0);
    MEM(bvis, 0);
    for (int i = 1; i <= n; i++)
    {
      scanf("%d %d %d", &a[i].w, &a[i].lc, &a[i].rc);
      avis[a[i].lc]++;
      avis[a[i].rc]++;
    }
    for (int i = 1; i <= m; i++)
    {
      scanf("%d %d %d", &b[i].w, &b[i].lc, &b[i].rc);
      bvis[b[i].lc]++;
      bvis[b[i].rc]++;
    }
    la = lb = 1;
    for (int i = 1; i <= n; i++)
      if (avis[i] == 0)
      {
        adfs(i);
        break;
      }
    for (int i = 1; i <= m; i++)
      if (bvis[i] == 0)
      {
        bdfs(i);
        break;
      }
    Getnest(lb - 1);
    int ans = kmp(la - 1, lb - 1);
    printf("%d\n", ans);
  }
}

cyk追楠神系列一

Description

众所周知,cyk 是个奇特的人,有一天,他终于又做出了一个惊 (zheng) 人 (chang) 的决定,他决定追楠神了!于是 cyk 就写了一封信向楠神表白。但是楠神作为 acm 的大佬,怎么能轻易答应 cyk,他决定对信做一个考察,为此他特意定义了“爱的证据”,“爱的证据”即如果在信里的一个长度等于 k 的字符子串里包含“love”,那么这就是一个“爱的证据”,比如 k=5 时,字符串“i love you”里“ love”和“love ”就是“爱的证据”。 现在,楠神想知道 cyk 写的信里有多少个“爱的证据”,假如“爱的证据”超过 m,那么他就会答应 cyk,如果小于等于 m,那么他就会丑拒。由于 cyk 的字太丑,所以楠神就把这项任务交给了你。

Input

第一行输入 t (1 <= t <= 100),代表有 t 组输入数据。

每组数据第一行输入 m, k (1 <= m, k <= 10^3)。

第二行输出一个字符串 a,长度不超过 10^3。

Output

每组输出占一行,假如楠神可以答应 cyk,就输出“congratulation”,如果不能就输出“too ugly to accept”。

Sample

Input

1
1 5
i love you

Output

congratulation

Reference Code

#include <stdio.h>
#include <string.h>
int main()
{
  int t, n, m, i, j, k, count, s;
  char a[1005];
  char b[6] = "love";
  scanf("%d", &t);
  while (t--)
  {
    scanf("%d%d", &m, &k);
    getchar();
    gets(a);
    int len = strlen(a);
    n = 0;
    for (i = 0; i < len - k + 1; i++)
    {
      count = 0;
      for (j = i; j < i + k; j++)
      {
        if (a[j] == b[count])
        {
          count++;
          if (count == 4)
          {
            n++;
            break;
          }
        }
        else
          count = 0;
      }
    }
    if (n >= m)
      printf("congratulation\n");
    else
      printf("too ugly to accept\n");
  }
}

bLue的文件查找器

Description

bLue 的电脑里存了各种各样的文件,随着文件越来越多,查找文件也成了一个麻烦事。

现在,他想要查找所有指定格式(扩展名)的文件,不过他并不会使用文件管理器自带的搜索功能,所以他想求你写一个文件查找器,来帮他查找所有指定格式的文件。

Input

输入数据有多组(数据组数不超过 100),到 EOF 结束。

对于每组数据:

  • 第一行输入一个整数 n (1 <= n <= 100) 和一个长度不超过 5 的字符串 ex,分别表示文件夹内的文件数量和要查找的文件的扩展名。
  • 接下来的 n 行,每行输入一个完整文件名。保证文件名不包含空格且长度不超过 100。

Output

对于每组数据,按照输入顺序输出文件夹内所有扩展名符合查找要求的文件名。

Sample

Input

6 cpp
3717.cpp
xunhuansai_daima.zip
xunhuansai_jietibaogao.pdf
C.cpp
bLue.jpg
cyk_de_richang.mp4

Output

3717.cpp
C.cpp

Reference Code

#include <stdio.h>
#include <string.h>
int main()
{
  int n, len, ex_len;
  int i, j, k;
  char s[101], ex[101], s_ex[101];
  while (~scanf("%d %s", &n, ex))
  {
    while (n--)
    {
      scanf("%s", s);
      len = strlen(s);
      ex_len = strlen(ex);
      for (i = len; i >= 0; i--)
      {
        if (s[i] == '.')
        {
          j = 0;
          k = i + 1;
          while (j < len - i)
            s_ex[j++] = s[k++];
          if (strcmp(ex, s_ex) == 0)
            printf("%s\n", s);
        }
      }
    }
  }
  return 0;
}

M - Period

Description

For each prefix of a given string S with N characters (each character has an

ASCII code between 97 and 126, inclusive), we want to know whether the prefix

is a periodic string. That is, for each i (2 ≤ i ≤ N) we want to know the largest K

> 1 (if there is one) such that the prefix of S with length i can be written as AK ,

that is A concatenated K times, for some string A. Of course, we also want to

know the period K.

Input

The input file consists of several test cases. Each test case consists of two

lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S.

The second line contains the string S. The input file ends with a line, having the

number zero on it.

Output

For each test case, output “Test case #” and the consecutive test case

number on a single line; then, for each prefix with length i that has a period K >

1, output the prefix size i and the period K separated by a single space; the

prefix sizes must be in increasing order. Print a blank line after each test case.

Sample

Input

3
aaa
12
aabaabaabaab
0

Output

Test case #1
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4

Reference Code

#include <string.h>
#include <stdio.h>
char s[1000010];
int next[1000010];
void get(char s[])
{
  int i = 0;
  int j = -1;
  int len = strlen(s);
  next[0] = -1;
  while (i <= len)
  {
    if (j == -1 || s[i] == s[j])
    {
      j++;
      i++;
      next[i] = j;
    }
    else
      j = next[j];
  }
}
int main()
{
  int n, i;
  int j = 0;
  while (scanf("%d", &n) != EOF)
  {
    if (n == 0)
      break;
    scanf("%s", s);
    get(s);
    j++;
    printf("Test case #%d\n", j);
    for (i = 2; i <= n; i++)
    {
      if (i % (i - next[i]) == 0 && i != (i - next[i]))
      {
        printf("%d %d\n", i, i / (i - next[i]));
      }
    }
    printf("\n");
  }
  return 0;
}
本文永久链接:https://blog.xmgspace.me/archives/sdut-experiments-data-structure-4.html
本文文章标题:SDUT《数据结构与算法》专题训练4 串 复刻版
如文章内无特殊说明,只要您标明转载/引用自Xiaomage's Blog,您就可以自由的转载/引用文章。禁止CSDN/采集站采集转载。
授权协议:署名-非商业性使用-相同方式共享 4.0 国际(CC BY 4.0)
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇